测试条件: gcc version 4.2.1 20070719 [freebsd] freebsd 7.2-release #0: fri may 1 07:18:07 utc 2009 [email protected]:/usr/obj/usr/src/sys/generic amd64
intel(r) xeon(r) cpu e5620 @ 2.40ghz 16核
测试程序说明: 先准备好n个字符串随机的md5字符串做为key,然后分别对3个容器进行插入、遍历、查找、删除操作。 例如,n=100的时候,插入是指插入100个随机md5 key;遍历是指对容器遍历一次;查找是指分别对这个100个随机的md5 key做查找操作(即查找100次);删除是指挨个删除这个100个随机md5 key。
测试数据如下表:
插入,单位us | 100 | 1k | 10k | 100k | 1m | 10m |
std::map | 241 | 2833 | 35888 | 381214 | 4439088 | 62233380 |
std::ext/hash_map | 97 | 1667 | 16466 | 146025 | 1788446 | 18512639 |
std::tr1::unordered_map | 77 | 772 | 8052 | 53094 | 658312 | 7429297 |
遍历,单位us | 100 | 1k | 10k | 100k | 1m | 10m |
std::map | 11 | 76 | 842 | 11603 | 155700 | 1771906 |
std::ext/hash_map | 47 | 430 | 4218 | 39880 | 470344 | 4781575 |
std::tr1::unordered_map | 1 | 1 | 2 | 1 | 2 | 1 |
查找,单位us | 100 | 1k | 10k | 100k | 1m | 10m |
std::map | 156 | 2111 | 30456 | 258709 | 4100260 | 59064394 |
std::ext/hash_map | 77 | 774 | 8056 | 56974 | 660231 | 7705527 |
std::tr1::unordered_map | 77 | 772 | 8051 | 54456 | 659537 | 7600263 |
删除,单位us | 100 | 1k | 10k | 100k | 1m | 10m |
std::map | 291 | 3641 | 49584 | 472414 | 6675897 | 92491113 |
std::ext/hash_map | 89 | 869 | 9068 | 86524 | 964767 | 10372650 |
std::tr1::unordered_map | 49 | 480 | 4879 | 33087 | 395098 | 4369617 |
结论: 1. std::tr1::unordered_map 与 std::ext/hash_map 任何情况下,如果要在这两个容器之间选择的话,
我们毫不犹豫应该选择 unordered_map。因为他的性能在上述4中操作中均优于 hash_map,甚至可以说远远优于 hash_map。
2. std::tr1::unordered_map 与 std::map map的性能总体来说是最差的。但是,
当我们需要一个有序的关联容器的时候,我们必须选择std::map,因为 unordered_map 内部元素不是有序的,这一点从名字都可以看出来。除此之外都应该选择 unordered_map 。
3. 上述测试中,unordered_map 的遍历性能几乎是常数级别的,与常识不太相符,需要再研究研究。
附录:贴上源代码 说明:与测试程序稍有区别,这里的源码里没有md5相关的代码以确保其他人能比较方便的直接拿去编译运行。
如有错误还请跟帖指出,非常感谢。
#include
#include
#include
#include
#include