源码

首页 » 归档 » 源码 » c – 为什么std :: vector :: operator []比std :: v…

c – 为什么std :: vector :: operator []比std :: v…


在程序优化期间,尝试优化迭代遍历向量的循环,我发现以下事实::: std :: vector :: at()比operator []快得多!

运算符[]比at()快5到10倍,在发布和发布时都是如此. debug builds(VS2008 x86).

在网上读了一下让我意识到at()有边界检查.好的,但是,将操作放慢了10倍?!

有什么理由吗?我的意思是,边界检查是一个简单的数字比较,还是我错过了什么?
问题是这种性能受损的真正原因是什么?
更进一步,有没有办法让它更快?

我肯定会在其他代码部分(我已经有自定义边界检查!)中将所有at()调用与[]交换.

概念证明:

#define _WIN32_WINNT 0x0400
#define WIN32_LEAN_AND_MEAN
#include 

#include 

#include 

#define ELEMENTS_IN_VECTOR  1000000

int main()
{
    __int64 freq, start, end, diff_Result;
    if(!::QueryPerformanceFrequency((LARGE_INTEGER*)&freq))
        throw "Not supported!";
    freq /= 1000000; // microseconds!

    ::std::vector vec;
    vec.reserve(ELEMENTS_IN_VECTOR);
    for(int i = 0; i < ELEMENTS_IN_VECTOR; i++)
        vec.push_back(i);

    int xyz = 0;

    printf("Press any key to start!");
    _getch();
    printf(" Running speed test../n");

    { // at()
        ::QueryPerformanceCounter((LARGE_INTEGER*)&start);
        for(int i = 0; i < ELEMENTS_IN_VECTOR; i++)
            xyz += vec.at(i);
        ::QueryPerformanceCounter((LARGE_INTEGER*)&end);
        diff_Result = (end - start) / freq;
    }
    printf("Result/t/t: %u/n/n", diff_Result);

    printf("Press any key to start!");
    _getch();
    printf(" Running speed test../n");

    { // operator []
        ::QueryPerformanceCounter((LARGE_INTEGER*)&start);
        for(int i = 0; i < ELEMENTS_IN_VECTOR; i++)
            xyz -= vec[i];
        ::QueryPerformanceCounter((LARGE_INTEGER*)&end);
        diff_Result = (end - start) / freq;
    }

    printf("Result/t/t: %u/n", diff_Result);
    _getch();
    return xyz;
}

编辑:
现在该值被赋予“xyz”,因此编译器不会“擦除”它.

(1)

本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/c-weishenmestd-vector-operator-bistd-v.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:9 月 26, 2019 at 05:15 上午

热评文章