| | | | | | | [文章信息] | | | 作者: | masterlee编译 | | 时间: | 2004-12-16 | | 出处: | 19XZ.COM | | 责任编辑: | 方舟 | |
| [文章导读] | | | 本文档深入分析了std::deque,并提供了一个指导思想:当考虑到内存分配和执行性能的时候,使用std::deque要比std::vector好 | |
| |
|
| | | |
|
|
|
|
|
实验二—— vector::reserve()的资源
目的
这个实验的目的是vector在加入大量数据之前调用reserve(),和deque进行比较,看它们的内存分配和执行效率怎么样?
描述
本实验中的测试基本上和实验一相同,除了在测试类的构造函数中加入下面这行代码:
| m_vData.reserve(1000000); | 结果
测试程序运行的平台和一些条件:
CPU
|
1.8 GHz Pentium 4 |
内存
|
1.50 GB |
操作系统
|
W2K-SP4 |
文件中的行数
|
9874 |
平均每行字母个数
|
1755.85 |
读文件的次数
|
70 |
总共插入的数据个数
|
691180 | 使用Windows任务管理器来记录执行效率,本程序中使用了>Laurent Guinnard 的CDuration类。消耗系统资源如下图:
我们注意到vector不在需要分配花费多余的时间分配内存了,这是由于我们使用了reserve()对于所测试的>691180个数据为我们每一次插入大量数据的时候保留了足够的内存空间,对于deque存储分配的假设,观察这个测试中的内存分配图形和上一个图形,我们需要进一步量化这个测试。
怎样改良内存分配的性能呢?
下面这个图例说明随着数据的增加,容量在增加:
当增加数据的时候对容量的增加在vector和deque执行效率基本一样,然而,vector在插入数据的时候有一些零星的时间消耗,看下面的图例:
通过统计分析vector和deque在插入平均为>1755.85长度的>9874个数据所花费的时间,下面是总结的表格:
Vector
|
Deque
|
Mean
|
0.603724814 sec
|
Maximum
|
0.738313000 sec
|
Minimum
|
0.559959000 sec
|
Std. Dev
|
0.037795736 sec
|
6-Sigma
|
0.226774416 sec
| |
Mean
|
0.588021114 sec
|
Maximum
|
0.615617000 sec
|
Minimum
|
0.567503000 sec
|
Std. Dev
|
0.009907800 sec
|
6-Sigma
|
0.059446800 sec
| |
实验三——内存回收
目的
本实验是对假设deque分配的内存不是临近的,而且很难回收进行量化测试分析。
描述
在本实验中再次用到了实验一中的代码,在调用函数中加入记录增加数据执行的效率具体入下面操作:
for(xRun=0; xRun<NUMBER_OF_XRUNS; xRun++) { df = new CVectorDequeTest; elapsed_time = 0;
for(i=0; i<NUMBER_OF_RUNS*xRun; i++) { cout << "Deque - Run " << i << " of " << NUMBER_OF_RUNS*xRun << "... "; df->ReadTestFile("F:\\huge.csv",DF_DEQUE); deque_data.push_back(datapoint()); deque_data.back().time_to_read = df->GetProcessTime(); elapsed_time += deque_data.back().time_to_read; deque_data.back().elapsed_time = elapsed_time; cout << deque_data.back().time_to_read << " seconds\n"; } vnElements.push_back(df->GetDequeSize()); cout << "\n\nDeleting... "; del_deque.Start(); delete df; del_deque.Stop(); cout << del_deque.GetDuration()/1000000.0 << " seconds.\n\n"; vTimeToDelete.push_back(del_deque.GetDuration()/1000000.0); }
| 结果
本测试和上面两个实验在相同的平台上运行,除了插入的数据由>9874到>691180,需要插入>70次,下面图例显示了>deque在插入数据的时候分配内存的情况,在deque里插入了平均每个长度为>1755.85的字符串。>
尽管从几个曲线图中看到的实际消耗时间不同,但些曲线图都精确到了>R2=95.15%。所给的数据点都实际背离了下表中统计的曲线图数据:
deque Results
|
Mean
|
0.007089269 sec
|
Maximum
|
11.02838496 sec
|
Minimum
|
-15.25901667 sec
|
Std. Dev
|
3.3803636 sec
|
6-Sigma
|
20.2821816 sec
| 在相同的情况下比较vector的结果是非常有意义的。下面图就是将vector和deque在相同的情况下分配内存消耗的时间比较图:
这些数据在这个测试中是>R2=82.12%。这或许可以经过每个点反复运行得到更加优化,在这个问题中这些数据适当地标注了这些点,所给的数据点都实际背离了下表中统计的曲线图数据:
vector Results
|
Mean
|
-0.007122715sec
|
Maximum
|
0.283452127 sec
|
Minimum
|
-0.26724459sec
|
Std. Dev
|
0.144572356sec
|
6-Sigma
|
0.867434136sec
|
|
|
|
|
|
|
|
|
|