performance - 性能优化策略最后的依据

  显示原文与译文双语对照的内容

这个站点上有很多性能问题,但我觉得几乎所有的都是problem-specific和相当窄的。 几乎所有的重复建议以避免过早的优化。

假设:

  • 代码已经正确工作
  • 选择的算法对于问题的情况已经是最优
  • 已经测量了代码,并隔离了违规的例程
  • 所有优化的尝试也将被测量,以确保它们不会变得更糟糕

这里我所寻找的是策略和技巧要挤出几个百分点一直) 到最后一个剩下的一个关键算法中当没有其他事情要做,但一切可能。

理想情况下,尝试使答案语言不可知,并在适用的策略中指明任何 down-sides 。

我将用我自己的初始建议添加一个回复,并期待栈溢出社区能想到的其他内容。

时间:

我大部分的生活都在这里度过。 广泛的方法是运行profiler并让它记录:

  • 高速缓存未命中 。数据缓存是大多数程序中的#1 源。 通过重组有缺陷的数据结构来提高缓存命中率,使它的具有更好的位置;包结构和数字类型降低浪费的字节( 因此浪费了缓存的获取) ;在尽可能减少延迟的情况下,预取数据。
  • 对于装入 op, Load-hit-stores 。编译器假设了指针失真,和是之间移动数据的情况下通过内存的时候,可以导致一定的病理行为使整个CPU流水线来清楚中断寄存器集 查找将浮点,向量和int转换为彼此的位置并消除它们。 使用 __restrict 自由地保证编译器的别名。
  • Microcoded操作 。大多数处理器都有一些不能流水线的操作,但是运行一个存储在ROM中的小子程序。 在PowerPC上的例子是整数乘法,除法和 shift-by-variable-amount 。 问题是在执行这里操作时整个管道停止运行。 尽量避免使用这些操作,或者至少将它们分解为各自的流水线流水线,这样你就可以在你的程序的其他部分上得到标量分派的好处。
  • 分支 mispredicts 。这些太空了管道。 寻找CPU花费大量时间重新填充管道的情况,并使用分支暗示,如果可用的话,可以让它更频繁地预测。 或者更好的是,只要有可能,用conditional-moves替换分支,特别是在浮点操作之后 ,因为它们的管道通常是更深的,并且在钙镁磷肥之后读取条件标志。
  • 的顺序 floating-point ops 。 使这些SIMD成为。

还有一个我想做的事情:

  • 在你 code, 将编译器设置成输出程序集清单和了解一下它能发出则为每个作用点 functions. "一个好的编译器应该能够为你自动完成"的所有聪明的优化? 你的实际编译器可能不执行这些操作。 我已经看到GCC发出了真正的WTF代码。
...