最后的性能优化策略

这个网站上已经有很多性能问题,但我发现几乎所有问题都是针对特定问题而且相当狭窄。几乎所有人都重复这些建议,以避免过早优化。

我们假设:

  • 代码已经正常工作

  • 所选择的算法对于问题的情况已经是最佳的

  • 已经测量了代码,并且已经隔离了违规的例程

  • 所有优化尝试也将被测量,以确保它们不会使事情变得更糟

我在这里寻找的是在一个关键算法中挤出最后几个百分点的策略和技巧,除此之外别无他法。

理想情况下,尝试使答案语言不可知,并在适用的情况下指出建议策略的任何缺点。

我将使用我自己的初步建议添加回复,并期待Stack Overflow社区可以想到的任何其他内容。最后的性能优化策略


慕田峪7331174
浏览 590回答 5
5回答

四季花海

当你无法再提高性能时 - 看看你是否可以提高感知性能。您可能无法更快地使用fooCalc算法,但通常有一些方法可以使您的应用程序对用户更具响应性。几个例子:预测用户将要求的内容并在此之前开始处理在结果显示时显示结果,而不是在结束时立即显示结果准确的进度表这些不会使您的程序更快,但它可能会让您的用户更快乐。

当年话下

我大部分时间都在这个地方度过。广泛的描述是运行你的探查器并让它记录:缓存未命中。数据缓存是大多数程序中排名第一的停顿源。通过重组有问题的数据结构来提高缓存命中率以获得更好的位置; 打包结构和数字类型以消除浪费的字节(因此浪费了缓存提取); 尽可能预取数据以减少停顿。加载热门商店。编译器关于指针别名的假设以及数据通过内存在断开的寄存器集之间移动的情况可能会导致某种病态行为导致整个CPU管道在加载操作中清除。找到浮动,向量和整体相互投射的位置并消除它们。使用__restrict自由地向编译器承诺别名。微编码操作。大多数处理器都有一些不能流水线操作的操作,而是运行一个存储在ROM中的微小子程序。PowerPC上的示例是整数乘法,除法和按变量移位量。问题是整个管道在执行此操作时停止运行。尝试消除这些操作的使用,或者至少将它们分解为组成的流水线操作,这样您就可以在程序的其余部分上获得超标量分派的好处。分支错误预测。这些太空了管道。查找CPU花费大量时间在分支后重新填充管道的情况,并使用分支提示(如果可用)使其更频繁地正确预测。或者更好的是,尽可能用条件移动替换分支,特别是在浮点运算之后,因为它们的管道通常更深,并且在fcmp之后读取条件标志会导致停顿。顺序浮点运算。制作这些SIMD。还有一件事我喜欢做:将编译器设置为输出汇编列表,并查看它为代码中的热点函数发出的内容。所有这些聪明的优化“一个好的编译器应该能够自动为你做”?有可能你的实际编译器不会这样做。我见过GCC发出真正的WTF代码。
打开App,查看更多内容
随时随地看视频慕课网APP