为什么在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元素之间的乘积。我请求你原谅这个无用的问题。我将删除此帖子。
这显然与"写入与覆盖"无关。
假设你的结果确实是正确的,我可以猜测编译器可以更有效地对你的"更快"版本进行矢量化(即流水线化(。
不同之处在于,在这个版本中,您为temp
分配了一个存储空间,而每个迭代都使用其自己的数组成员,因此所有迭代都可以独立执行。
您的"慢速1"版本创建了对单个temp
变量的(某种(错误依赖。原始编译器可能会"购买"它,从而生成非流水线代码。
您的"慢速2"版本似乎还可以,实际上,循环迭代是独立的。为什么速度还慢?我可以猜测这是由于使用了相同的CPU寄存器。也就是说,double
上的算术通常通过FPU堆栈寄存器来实现,这是循环迭代之间的干扰。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 在 C++ 中用派生类型重写成员函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 方法重写线程C++中的概念
- 为重写std::exception的库生成swig接口时出错
- 如何强制从重写方法调用重写的方法基方法?
- 用于C++的静态二进制检测或二进制重写工具和框架
- 如何将 if else 语句重写为 switch 语句
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 用 C 重写C++类
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 重写虚拟函数和继承
- C++调用使用重写函数的父类函数
- 重写打印函数而不是覆盖基类
- 不允许在类定义之外重写
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- C++:从抽象类重写纯虚拟运算符重载
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 重写函数不打印基类数据