有效的循环崩溃

Any*_*orn 1 language-agnostic algorithm performance loops collapse

在某些应用程序中,我需要将嵌套循环折叠成一个,同时保留单个索引信息.

for j in N:
  for i in M:
    ... A(i,j) ...

// Collapse the loops
for ij in MN:
  ... A(i,j) ...
Run Code Online (Sandbox Code Playgroud)

所以看了很明显的方法来恢复i,j从ij使用除法/模(昂贵的操作)和使用if语句(打破矢量化,分支预测问题).最后我提出了以下(使用C风格的比较) ):

j += (i == m)
i *= (i != m)
++i, ++ij
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?谢谢

Wil*_*ill 7

一般来说,如上所述,它没有提供折叠循环的性能优势.

编译器有时会崩溃这样的循环,但通常是以意想不到的方式.

在特定语言或特定平台上,您可以通过以下方式加速循环:

  • 向下计数
  • 使函数在体内"内联"调用,或者在循环体中使用代码而不是单独的函数
  • 配置编译器 - 通常通过命令行选项 - 来"展开"循环并删除帧指针等

但在所有情况下,您都必须对代码进行分析,以确保这些努力是有道理的.

一般来说,根据我的经验,这样的嵌套循环主要由:

  1. 容器; 尽可能避免拳击和边界检查,你知道你是安全的
  2. 调用其他方法的成本; 如果可以的话,使用'inline'
  3. 管道因不良参考地点而停滞; 如果可能,重新安排你的记忆
  4. 管道在第二条件下失速; 更少的ifs和间接引用更好

但这可能不适用于您的问题域和平台的建议. 简介!