優化程式效能—《深入理解計算機系統》
第一部分:基本策略
1)高階設計:適當的演算法和資料結構
2)基本編碼原則:使編譯器產生高效的程式碼,理解 編譯器 的能力和侷限性,消除不必要的內容
·消除連續的函式呼叫
·消除不必要的儲存器引用,要考慮是否為 同一地址
以上兩點,也是妨礙編譯器優化的主要因素,編譯器很難判斷以進行優化。
3)低階優化:將一個任務分成多個部分,利用多核和多處理器的平行計算;瞭解計算機的時序特性,為實現指令集並行,降低不同部分之間的資料相關;利用圖形資料流和確認關鍵路徑來確定一個迴圈需要的時間下界
·迴圈展開,程式碼移動(將迴圈中不會變的計算部分,移到迴圈外邊,如 for(int i=0;i<strlen(s);i++)中的strlen)
·多個累計變數和重新結合(如資料結合,整形編譯器可以自動重新結合,浮點數因為精度的原因,不會)等
·用功能的風格重寫條件操作,用條件傳遞代替條件控制,減小 預測懲罰
第二部分:定義與工具
1)表示程式效能:每元素的週期數(Cycles Per Element,CPE),越小越好,線性執行時間時,即為線性變數n的係數。
延遲界限(latency bound):當一系列操作必須按照嚴格順序執行時
吞吐量界限(throughput bound):處理器功能單元的原始計算能力
2)現代處理器包括:指令控制單元(instruction control unit,ICU) (取址和譯碼 控制、退役單元(記錄正在進行的處理,確保他遵守機器級程式的順序語義))、執行單元(execution unit,EU)(功能單元和快取記憶體的控制)。
資料流圖:迴圈暫存器之間的操作鏈 決定了限制性能的資料相關。
3)一些限制因素:暫存器溢位(暫存器不夠用)、預測錯誤處罰
4)理解儲存器效能:載入(在連結串列遍歷中成為關鍵瓶頸) 與 儲存,必須注意 寫/讀相關。
5)程式碼剖析程式
unix>gcc -o1 -pg prog.c -o prog
unix> ./prog file.txt
unix> gprof prog
6)Amdahl 定律
S=Told / Tnew = 1/( (1-a)+a/k ),a 為系統某部分需要時間的百分比,將他的效能提高了k倍。
文中有很多 例子的程式碼和資料流圖,很不錯。