又一个动态阵列与std :: vector,但是

Kri*_*ato 2 c++ arrays optimization performance vector

......好吧,我得到了奇怪的结果!

std::vector对动态数组的性能感到好奇.看来已经有很多关于这个问题的问题,如果我不经常得到这些"矛盾的"结果,我就不会提到它:vector<int>比某种方式更快new int[]!我一直认为如果有任何性能差异,它总是喜欢动态数组.这个结果怎么可能?

代码如下:

int numElements = 10000000;
 long j = 0;
 long k = 0;

 vector<int> intVector(numElements);
 int* intArray = new int[numElements]; 

 clock_t start, finish;
 start = clock();

 for (int i = 0; i < numElements; ++i)
  intVector[i] = i;
 for (int i = 0; i < numElements; ++i)
  j += intVector[i];

 finish = clock();
 cout << "j: " << j << endl;
 cout << "Total duration: " << (double) finish - start << " ms." << endl;

 // Test Control.
 start = clock();

 for (int i = 0; i < numElements; ++i)
  intArray[i] = i;
 for (int i = 0; i < numElements; ++i)
  k += intArray[i];

 finish = clock();
 cout << "k: " << k << endl;
 cout << "Total duration: " << (double) finish - start << " ms." << endl;
Run Code Online (Sandbox Code Playgroud)

优化是上,并且予分离的for内的每一个循环开始/结束块,这样我可以单独地加在阵列/向量的初始化(在这种情况下,std::vector<int>new int[]出现相同执行).

然而,与上面的代码我不断获得std::vector<int>殊荣,在26-30 ms36-45 msnew int[].

任何人都在关心为什么矢量比动态数组表现更好?两者都是在时序循环之前声明的,所以我预计性能大致相同.此外,我尝试了相同的想法而不是使用std::vector<int*>new int*[]获得类似的结果,vector类优于动态数组,因此指针指针也是如此.

谢谢您的帮助.

附录:没有优化,std::vector失去了动态数组的大时间(1,400 ms〜vs.~ 80 ms),以给出预期的性能差异,但这并不意味着矢量类可以某种方式进行优化,以提供比标准动态数组更好的性能?

Mik*_*our 6

我的猜测是,操作系统在首次访问之前不会分配物理内存.该vector构造函数初始化将所有的元素,所以内存将由你已经开始计时的时间进行分配.阵列内存未初始化(并且可能未分配),因此其时间可能包括分配.

尝试更改数组初始化以int* intArray = new int[numElements]();对其元素进行值初始化,并查看是否会更改结果.

  • 而你的疯狂猜测完全在目标上!那些括号现在给出了完全相同的性能.接得好. (3认同)