为什么C ++覆盖比写作慢?

时间:2015-06-14 10:02:30

标签: c++ performance stack heap-memory

无用的问题 - 要求删除 我必须运行一段代码来管理来自摄像头的视频流。 我试图提升它,我意识到一个奇怪的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 元素之间的产品。我请你原谅这个无用的问题。我将删除这篇文章。

1 个答案:

答案 0 :(得分:3)

这显然与#34;写作与覆盖&#34;无关。

假设你的结果确实是正确的,我可以猜测你的结果更快&#34;版本可以由编译器更有效地进行矢量化(即流水线化)。

在这个版本中,您为temp分配了一个存储空间,而每个迭代都使用自己的数组成员,因此所有迭代都可以独立执行。

你的&#34;慢1&#34; version会对单个temp变量产生(某种)错误依赖。原始编译器可能会&#34;购买&#34;它,生成一个非流水线代码。

你的&#34;慢2&#34;实际上版本似乎没问题,循环迭代是独立的。 为什么这还比较慢? 我猜这是因为使用了相同的CPU寄存器。也就是说,double上的算术通常是通过FPU堆栈寄存器实现的,这是循环迭代之间的干扰。