簡體   English   中英

為什么數組比矢量快得多?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM