for-loop机制效率提示

gil*_*gil 5 language-agnostic

由于我在大型多维数组上使用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)


Lev*_*Lev 9

尝试使你的循环在内存中连续,这将优化缓存使用.也就是说,不要这样做:

for (int i = 0; i < m; i++)  
    for (j = 0; j < n; j++)  
        s += arr[j][i];
Run Code Online (Sandbox Code Playgroud)
  • 如果处理图像,则使用单个索引将两个循环转换为像素上的一个循环.
  • 不要创建将运行零次的循环,因为管道已经过优化,假设循环将继续而不是结束.


Gre*_*ill 6

你测量了开销吗?您知道处理for循环花费了多少时间与执行应用程序代码花费了多少时间?你的目标是什么?


Ste*_*eim 5

循环展开可以是一种方式.那是:

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的倍数时,您将需要特殊处理.


Dav*_*ley 4

首先,不要为小事而烦恼。像向上计数和向下计数这样的细节通常与运行时间完全无关。众所周知,人类不善于发现代码中需要加速的区域。使用分析器。除非探查器另有说明,否则很少或根本不注意循环中未重复的任何部分。请记住,在内循环中编写的内容不一定在内循环中执行,因为现代编译器非常聪明地避免不必要的重复。

话虽这么说,但在现代 CPU 上展开循环时要非常小心。它们越紧,就越适合缓存。在我去年开发的一个高性能应用程序中,我通过使用循环而不是直线代码并尽可能地收紧它们,显着提高了性能。(是的,我进行了分析;相关函数占用了 80% 的运行时间。我还对典型输入的时间进行了基准测试,所以我知道这些更改有所帮助。)

此外,养成有利于高效代码的习惯也没有坏处。在 C++ 中,您应该养成使用预自增 (++i) 而不是后自增 (i++) 来递增循环变量的习惯。它通常并不重要,但可以产生重大影响,它不会降低代码的可读性或可写性,也不会造成伤害。