为什么我机器上的hash_map和unordered_map非常慢?

时间:2012-08-30 16:29:52

标签: c++ map hashmap unordered-map

我使用此代码测试了它们(在Visual Studio 2010 sp1上):

#include <ctime>
#include <iostream>
#include <map>
#include <unordered_map>
#include <hash_map>

int main()
{ 
    clock_t time;
    int LOOP = (1 << 16);
    std::map<int, int> my_map;
    std::unordered_map<int, int> map_unordered_map;
    std::hash_map<int, int> my_hash_map;

    time = clock();
    for (int i = 0; i != LOOP; ++i)
    {
        my_map[i] = i;
    }
    std::cout << "map: " << ((double)(clock() - time) / CLOCKS_PER_SEC) << std::endl;

    time = clock();
    for (int i = 0; i != LOOP; ++i)
    {
        map_unordered_map[i] = i;
    }
    std::cout << "unordered_map: " << ((double)(clock() - time) / CLOCKS_PER_SEC) << std::endl;

    time = clock();
    for (int i = 0; i != LOOP; ++i)
    {
        my_hash_map[i] = i;
    }
    std::cout << "hash_map: " << ((double)(clock() - time) / CLOCKS_PER_SEC) << std::endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}

结果很奇怪:

在调查中: 地图:0.289 unordered_map:10.738 hash_map:10.58 按任意键继续 。 。

在RELEASE中: 地图:0.101 unordered_map:0.463 hash_map:0.429 按任意键继续 。 。

2 个答案:

答案 0 :(得分:6)

  1. 你只在每张地图中插入65536个项目 - 不足以让O(log N)和O(1)之间的差异意味着很多。
  2. 插入项目,之后不进行任何搜索。
  3. 您的密钥是按顺序递增的所有连续整数 - 不适合通常使用任何地图的方式。
  4. 结论:这不太可能告诉你有关数据结构的更多信息。

答案 1 :(得分:1)

这是算法的摊销与最坏情况成本的一个例子。

std :: map使用具有O(logN)插入复杂度的红黑树 std :: hash_map使用具有O(1)分摊的插入复杂度的哈希表。

但是,当哈希表必须调整表格大小并重新表格时,哈希表的最坏情况是O(N)。

在你的情况下,你最终做了很多重复,所以哈希表插入最糟糕的情况是树插入变得更快 - O(N)&gt; O(logN)的

如果使用足够大的表初始化hash_map,那么哈希表将永远不会达到它的最坏情况,并且它将比树更快 - O(1)&lt; O(logN)的