【发布时间】:2010-03-03 15:43:33
【问题描述】:
我是优化方面的新手。我一直在阅读有关如何优化 c++ 代码的一些参考资料,但我很难将其应用于实际代码。因此,我只想收集一些真实世界的优化技术,以了解如何从下面的循环中尽可能多地从 CPU/内存中榨取汁液
double sum = 0, *array;
array = (double*) malloc(T * sizeof(double));
for(int t = 0; t < T; ++t){
sum += fun(a,b,c,d,e,f,sum);
*(array+t) = sum;
}
其中a,b,c,d,e,f 是double,T 是int。欢迎任何内容,包括但不限于内存对齐、并行性、openmp/MPI 和 SSE 指令。编译器是标准的 gcc、microsoft 或常用的编译器。如果解决方案是特定于编译器的,请与您的解决方案相关联的特定编译器和任何选项标志。
谢谢!
PS:忘了提到属性fun。请假设它是一个内部没有循环的简单函数,仅由基本的算术运算组成。简单地把它想象成一个内联函数。
EDIT2:由于fun的细节很重要,请忘记参数c,d,e,f并假设fun被定义为
inline double fun(a,b, sum){
return sum + a* ( b - sum);
}
【问题讨论】:
-
要优化,您通常需要知道某段代码值得优化。在不知道 fun(...) 的作用或 T 在实际中可以得到多大的情况下,这并不是一个真正有用的问题。
-
函数调用开销将超过任何循环优化(除非它是内联的)。您正在执行微优化而无需先进行测量。
-
为什么使用
*(array+t)而不是等效但更清晰的array[t]? -
编写不可读的代码应该让你被解雇。 叹息
-
此代码是否已被分析?你知道循环是问题吗?你知道 fun() 不是问题吗?分析代码后,您将能够更好地进行优化。如果您不进行概要分析,那么您的“优化”就是 SWAG。
标签: c++ c performance optimization loops