由于我在大型多维数组上使用for循环,因此对for循环机制本身的任何保存都是有意义的.
因此,我正在寻找有关如何减少这种开销的任何提示.
例如:倒计时使用UINT而不是int和= 0,而不是停止> 0允许CPU少做工作(听说这一次,不知道它始终是真实的)
pax*_*blo 12
一个重要的建议:尽可能多地计算外循环.并非所有编译器都能自动执行此操作.例如,而不是:
for row = 0 to 999
for col = 0 to 999
cell[row*1000+col] = row * 7 + col
Run Code Online (Sandbox Code Playgroud)
使用:
for row = 0 to 999
x = row * 1000
y = row * 7
for col = 0 to 999
cell[x+col] = y + col
Run Code Online (Sandbox Code Playgroud)
尝试使你的循环在内存中连续,这将优化缓存使用.也就是说,不要这样做:
for (int i = 0; i < m; i++)
for (j = 0; j < n; j++)
s += arr[j][i];
Run Code Online (Sandbox Code Playgroud)
循环展开可以是一种方式.那是:
for (i=0; i<N; i++) {
a[i]=...;
}
Run Code Online (Sandbox Code Playgroud)
转换为:
for (i=0; i<N; i+=4) {
a[i]=...;
a[i+1]=...;
a[i+2]=...;
a[i+3]=...;
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,当N不是4的倍数时,您将需要特殊处理.
首先,不要为小事而烦恼。像向上计数和向下计数这样的细节通常与运行时间完全无关。众所周知,人类不善于发现代码中需要加速的区域。使用分析器。除非探查器另有说明,否则很少或根本不注意循环中未重复的任何部分。请记住,在内循环中编写的内容不一定在内循环中执行,因为现代编译器非常聪明地避免不必要的重复。
话虽这么说,但在现代 CPU 上展开循环时要非常小心。它们越紧,就越适合缓存。在我去年开发的一个高性能应用程序中,我通过使用循环而不是直线代码并尽可能地收紧它们,显着提高了性能。(是的,我进行了分析;相关函数占用了 80% 的运行时间。我还对典型输入的时间进行了基准测试,所以我知道这些更改有所帮助。)
此外,养成有利于高效代码的习惯也没有坏处。在 C++ 中,您应该养成使用预自增 (++i) 而不是后自增 (i++) 来递增循环变量的习惯。它通常并不重要,但可以产生重大影响,它不会降低代码的可读性或可写性,也不会造成伤害。