簡體   English   中英

什么更便宜:遍歷使用單個ConcurrentHashMap的n個迭代器或HashMap的n個實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM