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