为什么在 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];
}
编辑
我意识到编译器正在优化 coeff 和 temp 元素之间的乘积。请原谅这个无用的问题。我会删除这个 post.
这显然与"writing vs overwriting"无关。
假设您的结果确实正确,我可以猜测您的 "faster" 版本可以更有效地由编译器矢量化(即流水线化)。
不同之处在于,在此版本中,您为 temp
分配了存储空间 space,而每次迭代都使用其自己的数组成员,因此所有迭代都可以独立执行。
您的 "slow 1" 版本创建了对单个 temp
变量的(某种)错误依赖。原始编译器可能 "buy" 它,生成非流水线代码。
您的"slow 2"版本实际上似乎没问题,循环迭代是独立的。
为什么这仍然较慢?
我猜这是由于使用了相同的 CPU 寄存器。也就是说,double
上的运算通常是通过FPU堆栈寄存器实现的,这是循环迭代之间的干扰。
无用的问题 - 要求删除 我必须 运行 一段代码来管理来自相机的视频流。 我试图提升它,我意识到一个奇怪的 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 元素之间的乘积。请原谅这个无用的问题。我会删除这个 post.
这显然与"writing vs overwriting"无关。
假设您的结果确实正确,我可以猜测您的 "faster" 版本可以更有效地由编译器矢量化(即流水线化)。
不同之处在于,在此版本中,您为 temp
分配了存储空间 space,而每次迭代都使用其自己的数组成员,因此所有迭代都可以独立执行。
您的 "slow 1" 版本创建了对单个 temp
变量的(某种)错误依赖。原始编译器可能 "buy" 它,生成非流水线代码。
您的"slow 2"版本实际上似乎没问题,循环迭代是独立的。
为什么这仍然较慢?
我猜这是由于使用了相同的 CPU 寄存器。也就是说,double
上的运算通常是通过FPU堆栈寄存器实现的,这是循环迭代之间的干扰。