我认为这个问题已经部分回答了,因为没有提供关于以“int”类型作为键的性能的信息。我做了我自己的分析,我发现std::map在许多实际情况下使用整数作为键时可以胜过std::unordered_map(在速度上)。
整数测试
测试场景包括使用顺序键和随机键填充映射,以及长度为17的倍数[17:119]的字符串值。执行测试时,元素计数范围为[10:10000000],以10为幂。
Labels:
Map64: std::map<uint64_t,std::string>
Map32: std::map<uint32_t,std::string>
uMap64: std::unordered_map<uint64_t,std::string>
uMap32: std::unordered_map<uint32_t,std::string>
插入
Labels:
Sequencial Key Insert: maps were constructed with keys in the range [0-ElementCount]
Random Key Insert: maps were constructed with random keys in the full range of the type
关于插入的结论:
当映射大小小于10000个元素时,在std::map中插入展开键往往优于std::unordered_map。
在std::map中插入密集键在1000个元素下与std::unordered_map没有性能差异。
在所有其他情况下,std::unordered_map往往执行得更快。
查找
Labels:
Sequential Key - Seq. Search: Search is performed in the dense map (keys are sequential). All searched keys exists in the map.
Random Key - Rand. Search: Search is performed in the sparse map (keys are random). All searched keys exists in the map.
(label names can be miss leading, sorry about that)
关于查阅的结论:
当地图大小小于1000000个元素时,在std::map上的搜索往往略优于std::unordered_map。
密集std::map的搜索性能优于std::unordered_map
查询失败
Labels:
Sequential Key - Rand. Search: Search is performed in the dense map. Most keys do not exists in the map.
Random Key - Seq. Search: Search is performed in the sparse map. Most keys do not exists in the map.
(label names can be miss leading, sorry about that)
关于查找失败的结论:
在std::map中搜索缺失是一个很大的影响。
一般的结论
即使在需要速度时,std::map用于整数键在许多情况下仍然是更好的选择。举个实际的例子,我有一本字典
在这里查找从未失败,尽管键具有稀疏分布,但它将在与std::unordered_map相同的速度下执行得更差,因为我的元素计数低于1K。内存占用显著降低。
字符串的测试
为了供参考,我在这里给出了字符串[string]映射的计时。键字符串是由一个随机的uint64_t值形成的,值字符串是在其他测试中使用的相同。
Labels:
MapString: std::map<std::string,std::string>
uMapString: std::unordered_map<std::string,std::string>
评价平台
操作系统:Linux - OpenSuse风滚草
编译器:g++ (SUSE Linux) 11.2.1 20210816
CPU: Intel(R) Core(TM) i9-9900 CPU @ 3.10GHz
内存:64 gb