gpt4 book ai didi

vector 上的 C++ operator() 优化

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:30:12 29 4
gpt4 key购买 nike

我正在编写数字代码,在其中定义 vector 运算很有用。例如,如果 x 和 y 是充满 float 的 n 长 vector ,那么 x^y 会导致 y 的第 i 个元素中的 a 等于 x 的第 i 个元素的某个任意函数。一种简单的方法是:

#include <vector>
#include <stdio.h>
#include <ctime>

using namespace std;

template <typename T>
void operator^(vector<T> A, vector<T> B){
typename vector<T>::iterator a = A.begin();
typename vector<T>::iterator b = B.begin();
while(a!=A.end()){
*b = 2*(*a);
a++; b++;
}
//for (uint i=0; i<A.size(); i++)
//B[i] = 2*A[i];
}

int main(int argc, char** argv){

int n = 10000;
int numRuns = 100000;
vector<float> A;
for (int i=0; i<n; i++)
A.push_back((float) i);

vector<float> B = vector<float>(n);
clock_t t1 = clock();
for (int i=0; i<numRuns; i++)
for (int j=0; j<n; j++)
B[j] = 2*A[j];
clock_t t2 = clock();
printf("Elapsed time is %f seconds\n", double(t2-t1)/CLOCKS_PER_SEC);

t1 = clock();
for (int i=0; i<numRuns; i++)
B^A;
t2 = clock();
printf("Elapsed time is %f seconds\n", double(t2-t1)/CLOCKS_PER_SEC);

return 0;
}

现在,在-O3编译后在我的电脑上运行时,输出是

Elapsed time is 0.370000 seconds
Elapsed time is 1.170000 seconds

如果我改为使用模板中注释掉的行,则第二次约为 1.8 秒。我的问题是:如何加快接线员调用速度?理想情况下,它应该花费与手动编码循环相同的时间。

最佳答案

您正在按值传递参数。这会生成 vector 的拷贝。

template <typename T>
void operator^(vector<T> A, vector<T> B)

如果您通过引用传递它们,您可能会获得加速。

template <typename T>
void operator^(vector<T> const& A, vector<T>& B)

(ideone.com 上的快速测试显示 even better performance 比手写循环,但我不知道他们在编译上启用了哪些优化。)

另一方面,您可能想要重载其他一些运算符。让非赋值和非递增运算符修改它们的参数是不好的风格(我建议阅读 Operator Overloading FAQ )。您应该改为重载 operator^=

template <typename T>
vector<T>& operator^=(vector<T>& B, vector<T> const& A){
typename vector<T>::const_iterator a = A.begin();
typename vector<T>::iterator b = B.begin();
while(a!=A.end()){
*b = 2*(*a);
a++; b++;
}
return B;
}

关于 vector 上的 C++ operator() 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7548691/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com