对几乎相同的代码执行不同的向量求和

2xB*_*2xB 3 c++ arrays performance vector stdvector

使用g++flag编译时,这些对数组和向量求和的函数之间似乎存在性能差异-O3

float sum1(float* v, int length) {
    float sum = 0;
    for(int i = 0; i < length; i++) {
        sum += v[i];
    }
    return sum;
}

float sum2(std::vector<float> v) {
    return sum1(&v[0], v.size());
}
Run Code Online (Sandbox Code Playgroud)

sum1使用例如长度为 100000 和sum2具有相同长度和内容的向量调用时,sum2最终大约为。比sum1我的测试慢 10% 。测量的运行时间是:

sum1: 0.279816 ms
sum2: 0.307811 ms
Run Code Online (Sandbox Code Playgroud)

现在这个开销从何而来?附加您还可以找到我在那里犯错误的可能性的完整测试代码。

[更新]通过引用 ( float sum2(std::vector<float>& v))调用时,性能差异约为 . 还剩下 3.7%,所以这会有所帮助,但在其他地方仍有一些性能损失?

[更新 2]其余的似乎在统计上占主导地位,从更多的迭代中可以看出。因此,唯一的问题确实是通过引用调用!


完整的测试代码(编译标志-O3g++,也与测试clang++):

sum1: 0.279816 ms
sum2: 0.307811 ms
Run Code Online (Sandbox Code Playgroud)

438*_*427 5

我认为开销来自传递向量。

尝试传递一个引用:

float sum2(std::vector<float>& v)
Run Code Online (Sandbox Code Playgroud)