为什么在C++中,重写比写入慢

Why in C++ overwritingis is slower than writing?

本文关键字:重写 C++ 为什么      更新时间:2023-10-16

无用问题-要求删除我必须运行一段代码来管理来自摄像机的视频流。我正在努力提升它,我意识到了一种奇怪的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];
} 

编辑我意识到编译器正在优化coefftemp元素之间的乘积。我请求你原谅这个无用的问题。我将删除此帖子。

这显然与"写入与覆盖"无关。

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

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

您的"慢速1"版本创建了对单个temp变量的(某种(错误依赖。原始编译器可能会"购买"它,从而生成非流水线代码。

您的"慢速2"版本似乎还可以,实际上,循环迭代是独立的。为什么速度还慢?我可以猜测这是由于使用了相同的CPU寄存器。也就是说,double上的算术通常通过FPU堆栈寄存器来实现,这是循环迭代之间的干扰。