无用的问题 - 要求删除 我必须运行一段代码来管理来自摄像头的视频流。 我试图提升它,我意识到一个奇怪的C ++行为。 (我必须承认我意识到我不懂C ++)
第一段代码运行速度比秒快,为什么?堆栈可能几乎已满?
更快的版本
double* temp = new double[N];
for(int i = 0; i < N; i++){
temp[i] = operation(x[i],y[i]);
res = res + (temp[i]*temp[i])*coeff[i];
}
较慢的版本1
double temp;
for(int i = 0; i < N; i++){
temp = operation(x[i],y[i]);
res = res + (temp*temp)*coeff[i];
}
较慢的版本2
for(int i = 0; i < N; i++){
double temp = operation(x[i],y[i]);
res = res + (temp*temp)*coeff[i];
}
修改 我意识到编译器正在优化 coeff 和 temp 元素之间的产品。我请你原谅这个无用的问题。我将删除这篇文章。
答案 0 :(得分:3)
这显然与#34;写作与覆盖&#34;无关。
假设你的结果确实是正确的,我可以猜测你的结果更快&#34;版本可以由编译器更有效地进行矢量化(即流水线化)。
在这个版本中,您为temp
分配了一个存储空间,而每个迭代都使用自己的数组成员,因此所有迭代都可以独立执行。
你的&#34;慢1&#34; version会对单个temp
变量产生(某种)错误依赖。原始编译器可能会&#34;购买&#34;它,生成一个非流水线代码。
你的&#34;慢2&#34;实际上版本似乎没问题,循环迭代是独立的。
为什么这还比较慢?
我猜这是因为使用了相同的CPU寄存器。也就是说,double
上的算术通常是通过FPU堆栈寄存器实现的,这是循环迭代之间的干扰。