【发布时间】:2012-12-03 09:48:42
【问题描述】:
这是比较向量与数组的公平测试吗?速度上的差异似乎太大了。我的测试表明该阵列快 10 到 100 倍!
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <windows.h>
#include <stdint.h>
using namespace std;
double PCFreq = 0.0;
__int64 CounterStart = 0;
using namespace std;
void StartCounter()
{
LARGE_INTEGER li;
if(!QueryPerformanceFrequency(&li))
std:cout << "QueryPerformanceFrequency failed!\n";
PCFreq = double(li.QuadPart)/1000000000;
QueryPerformanceCounter(&li);
CounterStart = li.QuadPart;
}
double GetCounter()
{
LARGE_INTEGER li;
QueryPerformanceCounter(&li);
return double(li.QuadPart-CounterStart)/PCFreq;
}
int _tmain(int argc, _TCHAR* argv[])
{
//Can do 100,000 but not 1,000,000
const int vectorsize = 100000;
cout.precision(10);
StartCounter();
vector<int> test1(vectorsize);
for(int i=0; i<vectorsize; i++){
test1[i] = 5;
}
cout << GetCounter() << endl << endl;
StartCounter();
int test2[vectorsize];
for(int i=0; i<vectorsize; i++){
test2[i] = 5;
}
cout << GetCounter() << endl << endl;
cout << test2[0];
int t = 0;
cin >> t;
return 0;
}
【问题讨论】:
-
看汇编代码。很有可能,几乎所有内容都在发布版本中进行了优化。
-
确实,您的第二个循环很可能已被编译器完全删除。
-
@user997112 正确。它被称为Dead Code Elimination。这是另一个例子:stackoverflow.com/questions/8841865/…
-
@user997112:您看到这种差异的事实可能表明您运行某种调试构建,未优化(甚至故意取消优化)并且断言严重超载(迭代器检查和类似的东西)。在调试版本中运行任何比较绝对没有意义。
-
一个区别是向量元素首先在构造函数中初始化为零,然后赋值为5。请尝试
vector<int> test1(vectorsize, 5);。
标签: c++ arrays performance vector