5 回答

TA貢獻1811條經驗 獲得超5個贊
當你無法再提高性能時 - 看看你是否可以提高感知性能。
您可能無法更快地使用fooCalc算法,但通常有一些方法可以使您的應用程序對用戶更具響應性。
幾個例子:
預測用戶將要求的內容并在此之前開始處理
在結果顯示時顯示結果,而不是在結束時立即顯示結果
準確的進度表
這些不會使您的程序更快,但它可能會讓您的用戶更快樂。

TA貢獻1890條經驗 獲得超9個贊
我大部分時間都在這個地方度過。廣泛的描述是運行你的探查器并讓它記錄:
緩存未命中。數據緩存是大多數程序中排名第一的停頓源。通過重組有問題的數據結構來提高緩存命中率以獲得更好的位置; 打包結構和數字類型以消除浪費的字節(因此浪費了緩存提?。? 盡可能預取數據以減少停頓。
加載熱門商店。編譯器關于指針別名的假設以及數據通過內存在斷開的寄存器集之間移動的情況可能會導致某種病態行為導致整個CPU管道在加載操作中清除。找到浮動,向量和整體相互投射的位置并消除它們。使用
__restrict
自由地向編譯器承諾別名。微編碼操作。大多數處理器都有一些不能流水線操作的操作,而是運行一個存儲在ROM中的微小子程序。PowerPC上的示例是整數乘法,除法和按變量移位量。問題是整個管道在執行此操作時停止運行。嘗試消除這些操作的使用,或者至少將它們分解為組成的流水線操作,這樣您就可以在程序的其余部分上獲得超標量分派的好處。
分支錯誤預測。這些太空了管道。查找CPU花費大量時間在分支后重新填充管道的情況,并使用分支提示(如果可用)使其更頻繁地正確預測?;蛘吒玫氖?,盡可能用條件移動替換分支,特別是在浮點運算之后,因為它們的管道通常更深,并且在fcmp之后讀取條件標志會導致停頓。
順序浮點運算。制作這些SIMD。
還有一件事我喜歡做:
將編譯器設置為輸出匯編列表,并查看它為代碼中的熱點函數發出的內容。所有這些聰明的優化“一個好的編譯器應該能夠自動為你做”?有可能你的實際編譯器不會這樣做。我見過GCC發出真正的WTF代碼。
添加回答
舉報