【发布时间】:2010-07-01 02:06:10
【问题描述】:
...好吧,我得到了奇怪的结果!
我很好奇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;
优化已开启,我在每个开始/结束块中分离了 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)上浪费大量时间,以提供预期的性能差异,但这并不意味着向量类可以以某种方式进行优化以提供比标准动态数组更好的性能?
【问题讨论】:
-
尝试循环更长的时间,至少几秒钟。如果您像这样使用向量,则应该几乎没有区别,除非您的编译器进行了一些奇怪的优化。也可以尝试禁用优化。
-
好吧,用 100M(而不是 10M)尝试它会得到 ~270ms 和 ~360ms,和以前一样,所以结果没有区别。但是,如果没有优化 std::vector 会浪费很多时间。使用 10M 个元素,它在 ~1,400 毫秒后完成,而仅在 ~80 毫秒后完成。那么,这是否意味着可以优化向量类以提供比动态数组更好的性能?
-
我的系统上出现了相反的行为,可能是因为我正在运行大量其他东西。矢量 - 2203 和新的 - 63。
-
@Kristian:如果没有优化,每次访问向量都需要一个函数调用,这将比内联等效项慢几个数量级。它还可以检查索引是否在每次访问的范围内。通过优化,这两个版本应该会产生非常相似的代码。
-
您使用的是什么操作系统(请参阅 Mike Seymour 的回答以了解其重要性)?
标签: c++ performance arrays optimization vector