簡體   English   中英

Map與Unordered_map —多線程

[英]Map vs Unordered_map— Multithreading

我有以下要求:

我需要具有鍵,值對的數據結構(如果有幫助,則鍵為整數)。

我需要以下操作:

  1. 迭代(最常用)
  2. 插入(使用次數第二高)
  3. 按鍵搜索和刪除(最少)

我計划在結構上使用多個鎖進行並發訪問。 理想的數據結構是什么?

地圖還是無序地圖?

我認為無序映射很有意義,因為我可以在O(1)中插入,在O(1)中刪除。 但是我不確定迭代。 與地圖相比,性能有多差?

另外,我計划在塊上使用多個鎖,而不是整個結構。 有什么好的實現示例嗎?

謝謝

兩個容器的迭代器遞增速度均為O(1) ,盡管您可能會從std::unordered_map獲得更好的緩存局部性。

除了std::map O(log N)查找/插入/擦除功能較慢之外,另一個區別是std::map提供了雙向迭代器,而std::unordered_map的速度更快(攤銷了O(1)元素訪問)僅提供轉發迭代器。

安東尼·威廉姆斯(Anthony Williams)的出色著作《行動中的C ++並發:實用多線程》提供了一個多線程unordered_map的代碼示例,每個條目都有一個鎖。 如果您要進行認真的多線程編碼,則強烈建議本書。

為什么不直接使用現有的concurrent_unordered_map ,你可以在這兩個發現TBBConcrt

unordered_map迭代不是問題。 它的效率比矢量要低一些,但並不是很大。

與往常一樣,您將需要對您的用例進行基准測試,並在代碼的關鍵部分將其與其他容器類型進行比較。

不確定“在塊上使用多個鎖而不是整個結構”是什么意思-任何容器更新都需要鎖定整個容器...

您是否考慮過嘗試std::deque的原因如下:

  1. 迭代速度很快-數據應或多或少地打包在一起(與列表不同)
  2. 插入(兩端)應快速進行-雙端隊列中的數據永遠不會調整大小
  3. 迭代和刪除速度較慢(但不常見的用例)。

如果最后兩種情況很常見,則可以使用std::list 還可以考慮測試std :: vector,因為它的緩存效率更高。

由於要對哈希表中的大量未使用元素進行迭代,因此unordered_map迭代可能會比較慢。 插入將一直處於等待狀態,直到沖突級別變得無法忍受為止,此時將需要重新布置整個數據結構。

map的迭代速度相對較快,但數據元素可能相距較遠。 由於需要重新平衡紅黑樹,因此插入可能會很慢。

unordered_maps的主要用例是用於快速查找(O1)。 法線貼圖具有最快的查找(O log n),但迭代性能更好。

如果您對實時性有嚴格的要求,建議您在unordered_map上進行映射。 std :: map在100%的時間內保證了性能,但在某些緊急情況下std :: unordered_map可能會進行重新哈希處理並完全破壞實時性能。 總的來說,如果我需要絕對保證最壞情況下的性能,則我更喜歡紅黑樹(std :: map)而不是哈希表(std :: unordered_map)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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