繁体   English   中英

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

[英]Why in C++ overwritingis is slower than writing?

无用的问题-要求删除我必须运行一段代码来管理来自摄像机的视频流。 我试图增强它,但我意识到了一种奇怪的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堆栈寄存器实现的,这是循环迭代之间的干扰。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM