在使用
现在我们从哪里得到这个开销呢?如果我有任何错误,您可以在下面找到完整的测试代码。
[更新] 当使用引用调用(float sum2(std::vector& v))时,大约会有3.7%的性能差异,这有所帮助,但仍然会有一些性能损失发生在其他地方?
[更新2] 其余部分似乎被统计支配,通过更多迭代可以看出。因此,真正的问题就是引用调用!
完整的测试代码(使用g++编译器以-O3标志进行编译,并使用clang++进行测试):
g++
标志-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());
}
在调用具有长度为100,000的向量的sum1
和具有相同长度和内容的向量的sum2
时,在我的测试中,sum2
的运行速度比sum1
慢约10%。
测量的运行时间如下:
sum1: 0.279816 ms
sum2: 0.307811 ms
现在我们从哪里得到这个开销呢?如果我有任何错误,您可以在下面找到完整的测试代码。
[更新] 当使用引用调用(float sum2(std::vector& v))时,大约会有3.7%的性能差异,这有所帮助,但仍然会有一些性能损失发生在其他地方?
[更新2] 其余部分似乎被统计支配,通过更多迭代可以看出。因此,真正的问题就是引用调用!
完整的测试代码(使用g++编译器以-O3标志进行编译,并使用clang++进行测试):
#include <iostream>
#include <chrono>
#include <vector>
using namespace std;
std::vector<float> fill_vector(int length) {
std::vector<float> ret;
for(int i = 0; i < length; i++) {
float r = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
ret.push_back(r);
}
return ret;
}
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());
}
int main() {
int iterations = 10000;
int vector_size = 100000;
srand(42);
std::vector<float> v1 = fill_vector(vector_size);
float* v2;
v2 = &v1[0];
std::chrono::duration<double, std::milli> duration_sum1(0);
for(int i = 0; i < iterations; i++) {
auto t1 = std::chrono::high_resolution_clock::now();
float res = sum1(v2, vector_size);
auto t2 = std::chrono::high_resolution_clock::now();
cout << "Result sum1: " << res << endl;
duration_sum1 += t2 - t1;
}
duration_sum1 /= iterations;
std::chrono::duration<double, std::milli> duration_sum2(0);
for(int i = 0; i < iterations; i++) {
auto t1 = std::chrono::high_resolution_clock::now();
float res = sum2(v1);
auto t2 = std::chrono::high_resolution_clock::now();
cout << "Result sum2: " << res << endl;
duration_sum2 += t2 - t1;
}
duration_sum2 /= iterations;
cout << "Durations:" << endl;
cout << "sum1: " << duration_sum1.count() << " ms" << endl;
cout << "sum2: " << duration_sum2.count() << " ms" << endl;
}
float sum2(std::vector<float>& v)
。 - user9400869float sum2(std::vector<float> v)
-- C++有多种传递参数的方式。不幸的是,您选择了“按值传递”,而不是“按引用传递”。需要改为:@2xBfloat sum2(std::vector<float>& v)
- PaulMcKenziev.data()
而不是&v[0]
。同时,float sum3(std::vector<float> & v) { return std::accumulate(v.begin(), v.end(), 0.0f); }
。 - Caleth