测试环境:
操作系统:windows xp 32位 开发调试工具:visual stdio 2005
CPU: intel E6550 2.33G 双核 内存:2GB
测试数据模型:
三种MAP的键(key):值(value)类型:
Map<int,int> 、 hash_map<int, int> 、ACE_Hash_Map_Manager<int,int>
Deque 和 list的节点数据结构为:
Struct TestNode{
Int m_nValue1;
Int m_nValue2;
};
Deque<TestNode> 、list<TestNode>
容器类型 | 插入 | 查找100W次 | 遍历 | 迭代删除 | 占用内存 |
Stl:map | 17017 | 7007 | 2002 | 17017 | 89,080K |
Stl:hash_map | 308308 | 3003 | 2002 |
| 84,300K |
ACE_Hash_Map_Manager | 48048 | 46046 | 0.343 | 2002 | 81,140K |
|
|
|
|
|
|
Stl:deque | 5005 |
| 1001 | 23023 | 44,015K |
Stl:list | 4004 |
| 2002 | 18018 | 81,188K |
Stl:list(10W) | 0.468 |
| 0.234 | 2002 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Stl:map 、stl:hash_map 、ACE_Hash_Map比较:
1、 stl:map 的插入、删除都比hash_map快,只是查找相对要慢一点点;
2、 stl:hash_map 的插入是 三者中最低效的,但是其查找速度确实比较快;
3、 ACE_Hash_Map的插入和查找都比较慢,只是遍历和删除要优于其他两者;
综合来看,stl:map在各方面表现都比较平均,而stl:hash_map仅仅在查找速度上超越stl:map一点,ACE_Hash_Map在查找速度上表现就很可怜。所以,如果对数据操作时插入、查找、删除、遍历都要用到时,推荐使用stl:map;如果对数据的操作,一开始就把所有数据读取完毕,后面只会用到查找,不会对数据进行插入、删除时,推荐使用stl:map;ACE_Hash_Map在支持STL的平台上不推荐使用,可用到没有STL的平台上。
容器容量 | insert | Push | 遍历 | erase | pop | 占用内存 |
10W | 546 | 0.125 | 0.187 | 2002 | 0.031 | 6.9M |
100W | 5005 | 1001 | 1001 | 23023 | 0.312 | 44.36M |
1000W | 50050 | 11011 | 18018 | 238238 | 2002 | 421M |
Deque 与 list 的比较:
1、 deque 在内存分配策略上要比list更优;
2、 由于deque是大块大块的分配内存,所以在数据量小的时候,deque占用内存可能比list大,但是当数据量达到成万以上时,deque内存分配现越来越优秀,占用内存甚至只有list的一半以下。所以,如果单个容器中数据比较少,优先使用list;如果单个容器中数据量比较大,推荐使用deque。
3、 deque 在10W级别以上的数据测试中,在中间插入和采用迭代删除要比list慢一些,但是迭代所花时间几乎是list的一半;
4、 deque 采用pop_ / push_ 系列函数要比 insert / erase 函数快很多
测试用代码:
略。