测试环境:
操作系统: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 函数快很多
测试用代码:
略。