[英]What's cheaper: Traversal using n iterators of a single ConcurrentHashMap or n instances of a HashMap
想象一下生產者 - 消費者場景,線程A產生條目,一個到多個其他線程使用它們。
為此,我將一堆條目傳遞給每個消費者線程。
這樣做我問自己它是否更便宜(在cpu utlization方面是主要的,在內存中是次要的):
HashMap
的單獨實例。 在將Map
傳遞給一個使用者之后,將創建一個新的Map
實例並用於將下一個生成的條目傳遞給下一個線程 要么
ConcurrentHashMap
並為每個使用者線程創建一個Iterator
,並在將Iterator
傳遞給清除Map
的線程之后 - 以便每個Iterator包含它自己的底層Map
視圖。 你怎么看? 一個或多或少的通用答案可能嗎?
或者它是否強烈依賴於一些變量,如條目數,線程數等?
編輯:或者我應該使用其他類型的數據結構,可以更好地解決這些問題?
java並發包為這種情況提供了一種數據結構。
@see java.util.concurrent.BlockingDeque
但是請做一些性能測試:因為結果非常依賴於你的用例。 如果這只是微優化,而不是:干凈,易於理解,線程保存方法將比沒有影響的性能優化好得多。
cpu-wise最昂貴的是線程爭用。 似乎,你的第一種方法根本不會產生爭用 - 每個線程都會有它的本地版本的Map - 而代價是更高的內存消耗。
舉個例子,我會針對幾個設置(線程數,地圖大小等)的兩個場景進行基准測試。 沒有基准就很難說清楚確切的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.