深入研究 C++中的 STL Deque 容器(二)
来源:互联网 发布:ubuntu五笔输入法 编辑:程序博客网 时间:2024/04/29 08:05
实验二—— vector::reserve()的资源
目的
这个实验的目的是vector在加入大量数据之前调用reserve(),和deque进行比较,看它们的内存分配和执行效率怎么样?
描述
本实验中的测试基本上和实验一相同,除了在测试类的构造函数中加入下面这行代码:
m_vData.reserve(1000000);
结果
测试程序运行的平台和一些条件:
使用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
目的
这个实验的目的是vector在加入大量数据之前调用reserve(),和deque进行比较,看它们的内存分配和执行效率怎么样?
描述
本实验中的测试基本上和实验一相同,除了在测试类的构造函数中加入下面这行代码:
m_vData.reserve(1000000);
结果
测试程序运行的平台和一些条件:
CPU
1.8 GHz Pentium 4 内存
1.50 GB 操作系统
W2K-SP4 文件中的行数
9874 平均每行字母个数
1755.85 读文件的次数
70 总共插入的数据个数
691180
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
- 深入研究 C++中的 STL Deque 容器(二)
- 深入研究 C++中的 STL Deque 容器(二)
- 深入研究 C++中的 STL Deque 容器
- 深入研究 C++中的 STL Deque 容器
- 深入研究 C++中的 STL Deque 容器
- 深入研究 C++中的 STL Deque 容器
- 深入研究 C++中的 STL Deque 容器
- 深入研究 C++中的 STL Deque 容器
- 深入研究 C++中的 STL Deque 容器
- 深入研究 C++中的 STL Deque 容器
- 深入研究 C++中的 STL Deque 容器
- 深入研究 C++中的 STL Deque 容器
- 深入研究 C++中的 STL Deque 容器
- 深入研究 C++中的 STL Deque 容器
- 深入研究 C++中的 STL Deque 容器
- 深入研究 STL Deque 容器
- 深入研究 STL Deque 容器
- 深入研究 STL Deque 容器
- 简洁的StringBuilder类
- 为何选择存储虚拟化
- 深入研究 C++中的 STL Deque 容器(1)
- 生活_男人的十大补品
- 白领男士的10种短命生活方式
- 深入研究 C++中的 STL Deque 容器(二)
- 这年头
- 恢复"显示桌面"按钮
- 初始化順序
- 深入研究 C++中的 STL Deque 容器(三)
- Oracle 物化视图
- MySQL的存在空间在哪里?
- Backup Backup Backup
- mime type