15

我正在尝试在以下用例之间map进行选择:unordered_map

的键map是指针。最常见的用例是地图中只有一个元素。一般来说,地图中的最大元素数小于 10。地图的访问频率很高,速度是最重要的因素。地图的更改很少见。

虽然在这里测量速度显然是正确的方法,但此代码将在多个平台上使用,因此我试图创建一个通用的经验法则,用于在 amapunordered_map基于元素数量之间进行选择。我在这里看到一些帖子暗示 std::map 对于少量元素可能更快,但没有给出“小”的定义。

何时根据元素数量在 amap和之间进行选择是否有经验法则?unordered_map另一种数据结构(例如通过 a 进行线性搜索vector)是否更好?

4

2 回答 2

22

在您总是需要测量以找出在性能方面更合适的前提下,如果所有这些事情都是真的:

  1. 地图的变化并不频繁;
  2. 地图最多包含 10 个元素;
  3. 查找会很频繁;
  4. 你非常关心性能;

然后我会说你最好把你的元素放在一个中std::vector并对所有元素进行简单的迭代以找到你正在寻找的那个。

Anstd::vector将在内存的连续区域中分配其元素,因此缓存局部性可能会为您提供更高的性能 - 缓存未命中后从主内存获取缓存行所需的时间至少比时间高一个数量级需要访问 CPU 缓存。

非常有趣的是,Boostflat_map似乎非常适合您的用例(由Praetorian提供):

flat_map类似于std::map但它像有序向量一样实现。(来自在线文档

因此,如果您可以选择使用 Boost,您可能想试试这个。

于 2013-03-25T21:46:31.987 回答
4

我相信对于您的 10 个或更少元素的情况,通常只有一个,对未排序向量的线性搜索效果最好。但是,根据使用的哈希算法,unordered_map 可能会更快。

它应该很容易让您进行基准测试。

于 2013-03-25T21:47:01.590 回答