大家都知道在C++的STL中map是使用树来做查找算法,而hash_map使用hash表来排列配对,是使用关键字来计算表位置。那使用起来他们的差别主要是什么呢?对于性能差别是什么,适合什么情况下应用呢?于是我对它们进行了一些测试,并记录了测试数据供大家分享。 测试的内容主要是map和hash_map的添加、删除、查找和遍历操作,首先进行了几组测试,分别是10万次、30万次,时间单位均为毫秒,具体的性能对照如下: hash_map(10万) map(10万) hash_map(20万) map(20万) hash_map(30万) map(30万) 添加 93 47 156 94 203 172 遍历 16 15 16 16 16 15 查找 0 0 32 31 31 32 删除 8422 32 33765 63 76016 78 通过上面的数据比较,我们很容易发现hash_map的添加和删除操作比map要慢,尤其是删除操作hash_map比map可能慢1000倍;从而得到结论是删除和插入操作较多的情况下,map比hash_map的性能更好,添加和删除的数据量越大越明显。但我们使用map、hash_map一般都用于查找和遍历较多,而且上述测试数据也不能反映出这两方面的性能差距,于是继续对查找和遍历进行了性能测试,得到具体数据如下,时间单位仍为毫秒: hash_map(100万) map(100万) hash_map(200万) map(200万) hash_map(300万) map(300万) 遍历 94 31 203 32 297 47 查找 94 234 188 531 281 875 通过上面的测试数据可以得出结论是map的遍历性能高于hash_map,而查找性能则相反,hash_map比map要好,数据量越大查找次数越多,表现就越好。 两大组测试完毕,整体结论也可以得出:一般应用情况下,我们保存的数据不超过100万份,查找的频繁程度不高情况下使用map性能比较好;而保存的数据较多时(超过100万),查找频繁时使用hash_map的性能就高于map了。
测试环境具体如下: 操作系统:Windows XP Professional (5.1, Build 2600) Service Pack 3 (2600.xpsp_sp3_gdr.080814-1236) 编译环境:Microsoft Visual C++ 2005 55603-007-4000003-41525 处理器:Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz (2 CPUs) 内存:2044MB RAM, 另外,整个测试仅使用物理内存,而没有虚拟内存,使用Release版本直接在控制台中运行,而没有在IDE中运行,避免影响性能;且对于较短时间计时,少于20毫秒以下可能不准确。
新浪网友 楼主你测试的都是内置类型吧,如int,你可以试试string或者你自己定义的类型,比如一个结构体。我保证结果完全不一样~ 我说一下,如果是内置类型的话,的确总的来说还是map的性能高一些,如果是自定义的类型或者string的话,那么hash_Map的性能会高出许多。2012-7-23 10:51