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