这是将矢量与数组进行比较的公平测试吗?速度的差异似乎太大了。我的测试表明阵列的速度要快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;
}
答案 0 :(得分:11)
这取决于你的比较。
您的基准测试同时测量设置时间和访问时间。毫无疑问std::vector
设置时间更长。这是因为它需要分配内存,然后(根据标准的必要性)调用所有元素的默认构造函数。对于POD类型,这意味着归零。
因此,如果您正在尝试衡量访问时间,那么您的基准测试就不准确。
以下是一些要消化的数字:
原始代码:
StartCounter();
vector<int> test1(vectorsize);
for(int i=0; i<vectorsize; i++){
test1[i] = 5;
}
cout << GetCounter() << endl << endl;
时间:444353.5206
在声明并初始化vector
之后开始计时:
vector<int> test1(vectorsize);
StartCounter();
for(int i=0; i<vectorsize; i++){
test1[i] = 5;
}
cout << GetCounter() << endl << endl;
时间:15031.76101
对于阵列:
StartCounter();
int test2[vectorsize];
for(int i=0; i<vectorsize; i++){
test2[i] = 5;
}
cout << GetCounter() << endl << endl;
时间:38129.345
无论宣言是否定时,时间大致相同。这很可能是因为堆栈分配是在进入函数时立即完成的。
基本上,向量内存分配和初始化花费了不成比例的时间。但实际的循环很快。
我还会注意到,您当前的基准测试框架仍然存在严重缺陷。您只能在每个数组上进行一次传递。因此缓存效果和延迟分配将是重要的。
数组现在较慢的原因可能是由于延迟分配。数组已分配,但尚未提交。延迟分配意味着它在首次访问时提交 - 这涉及页面错误和上下文切换到内核。
这是一个更公平的测试,使用外部循环来增加基准时间:
vector<int> test1(vectorsize);
StartCounter();
for (int c = 0; c < 10000; c++){
for(int i=0; i<vectorsize; i++){
test1[i] = 5;
}
}
cout << GetCounter() << endl << endl;
时间:227330454.6
int test2[vectorsize];
memset(test2,0,sizeof(test2));
StartCounter();
for (int c = 0; c < 10000; c++){
for(int i=0; i<vectorsize; i++){
test2[i] = 5;
}
}
cout << GetCounter() << endl << endl;
cout << test2[0];
时间:212286228.2
所以没有一个数组 NOT 比稳态访问的矢量更快。正确地进行基准测试真的很棘手。