![](/img/trans.png)
[英]Why is iterating an std::array much faster than iterating an std::vector?
[英]Why is an array so much faster than a vector?
這是將矢量與數組進行比較的公平測試嗎? 速度的差異似乎太大了。 我的測試表明陣列的速度要快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;
}
這取決於你的比較。
您的基准測試同時測量設置時間和訪問時間。 毫無疑問, 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
因此,沒有一個數組不大於穩態訪問向量更快。 正確地進行基准測試真的很棘手。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.