[英]Map vs Unordered_map— Multithreading
我有以下要求:
我需要具有鍵,值對的數據結構(如果有幫助,則鍵為整數)。
我需要以下操作:
我計划在結構上使用多個鎖進行並發訪問。 理想的數據結構是什么?
地圖還是無序地圖?
我認為無序映射很有意義,因為我可以在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
的代碼示例,每個條目都有一個鎖。 如果您要進行認真的多線程編碼,則強烈建議本書。
在unordered_map
迭代不是問題。 它的效率比矢量要低一些,但並不是很大。
與往常一樣,您將需要對您的用例進行基准測試,並在代碼的關鍵部分將其與其他容器類型進行比較。
不確定“在塊上使用多個鎖而不是整個結構”是什么意思-任何容器更新都需要鎖定整個容器...
您是否考慮過嘗試std::deque
的原因如下:
如果最后兩種情況很常見,則可以使用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.