繁体   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