深入研究 C++中的 STL Deque 容器(二)

来源:互联网 发布:ubuntu五笔输入法 编辑:程序博客网 时间:2024/04/29 08:05
实验二—— 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