[英]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];
}
编辑我意识到编译器正在优化coeff和temp之间的乘积。 请原谅这个无用的问题。 我将删除此帖子。
显然,这与“写入与覆盖”无关。
假设您的结果确实正确,我可以猜测编译器可以更有效地对您的“更快”版本进行矢量化(即流水线化)。
区别在于,在此版本中,您为temp
分配了存储空间,而每次迭代都使用其自己的数组成员,因此所有迭代都可以独立执行。
您的“慢速1”版本对单个temp
变量产生了(某种)错误的依赖。 原始编译器可能会“购买”它,从而生成非流水线的代码。
实际上,您的“慢2”版本似乎还可以,循环迭代是独立的。 为什么还慢呢? 我可以猜测这是由于使用了相同的CPU寄存器。 也就是说, double
精度算术通常是通过FPU堆栈寄存器实现的,这是循环迭代之间的干扰。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.