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 ms对36-45 ms的new int[].
任何人都在关心为什么矢量比动态数组表现更好?两者都是在时序循环之前声明的,所以我预计性能大致相同.此外,我尝试了相同的想法而不是使用std::vector<int*>和new int*[]获得类似的结果,vector类优于动态数组,因此指针指针也是如此.
谢谢您的帮助.
附录:没有优化,std::vector失去了动态数组的大时间(1,400 ms〜vs.~ 80 ms),以给出预期的性能差异,但这并不意味着矢量类可以某种方式进行优化,以提供比标准动态数组更好的性能?
我的猜测是,操作系统在首次访问之前不会分配物理内存.该vector构造函数初始化将所有的元素,所以内存将由你已经开始计时的时间进行分配.阵列内存未初始化(并且可能未分配),因此其时间可能包括分配.
尝试更改数组初始化以int* intArray = new int[numElements]();对其元素进行值初始化,并查看是否会更改结果.