【发布时间】:2016-06-23 02:32:32
【问题描述】:
我做了一些随机测试,但我无法得出结论。
如果将 1000000 个整数插入到 map 和 unordered_map 中,map 使用的时间是 3 倍。
如果插入 1000000 个字符串,那么 map 使用的时间是 2 倍。
std::unordered_map 在什么情况下会表现得很慢?
提前致谢。
UPD:: gcc 版本 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)。所有测试都没有 -O2。
代码:
a.cpp:std::map<int, int> M;
b.cpp:std::unordered_map<int, int> M;
g(i, 1, 1000000) {
M[i] = rand() % i;
}
我的测试结果:
yyhs@yyhs-Pro:~/Documents$ g++ a.cpp -o a -g --std=c++11 && time ./a
real 0m0.659s
user 0m0.653s
sys 0m0.004s
yyhs@yyhs-Pro:~/Documents$ g++ b.cpp -o b -g --std=c++11 && time ./b
real 0m0.260s
user 0m0.251s
sys 0m0.008s
yyhs@yyhs-Pro:~/Documents$ g++ a.cpp -o a -g --std=c++11 -O2 && time ./a
real 0m0.290s
user 0m0.282s
sys 0m0.008s
yyhs@yyhs-Pro:~/Documents$ g++ b.cpp -o b -g --std=c++11 -O2 && time ./b
real 0m0.081s
user 0m0.081s
sys 0m0.000s
我的问题是什么情况可能导致 std::unordered_map 变慢。
【问题讨论】:
-
您没有发布您使用的编译器以及用于构建测试的编译器选项。如果您正在计时“调试”或未优化的构建,那么结果将毫无意义。
-
非常感谢@PaulMcKenzie。我已经添加了详细信息。
-
当您说“没有 -O2”时,您是说您正在计时未优化的构建?
-
然后阅读我的第一条评论。结果毫无意义。时间优化的构建。
-
当你遇到很多冲突时,哈希映射很慢,和/或哈希函数的评估很慢。你可以用长字符串得到后者。哈希需要考虑整个字符串,而根据树中的节点检查字符串可能只考虑第一个小部分。
标签: c++