繁体   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