優化程序性能(CSAPP:5)
阿新 • • 發佈:2018-06-14
別名 並行 之間 結構 性能 增加 理解 可能 clas
【前言】雖然現在沒有接觸過大型項目,但是工作了會註重性能。學習一下,應該能更好更快的理解別人寫的經典優秀的代碼。結合CSAPP和自己的理解,總結一下。
一、程序優化綜述
1、高效程序的特點
(1)適當的算法和數據結構。方法和數據的組織形式無疑是最關鍵的,是優化的基礎;
(2)代碼能夠被編譯器轉化成高效的可執行代碼。需要深入了解使用的編譯器的優化方法,和常見的優化策略;
(3)運用現代並行編程技術。多核以及硬件支持提供更大的加速可能,例如GPU;
2、優化程序的一般步驟
(1)消除不必要的工作,例如消除不必要的函數調用(加大棧區負擔),條件測試和內存引用;
(2)利用處理器提供的指令級並行能力,同時執行多條指令;指令級並行介於線程級並發和單指令多數據並行之間,一個處理器可實現多指令執行,例如流水線技術;
(3)優化關鍵路徑。就是反復執行的數據和代碼;
二、優化編譯器的能力和局限性
我們可以使用-O1、-O2、-O3來指定編譯器的優化級別,級別越高可能會增加程序的規模。註意一點,優化級別高一般比級別低的性能好,肯定比原始未優化的好!但是,編譯器在優化時會考慮安全問題,如果優化一定會在安全範圍內優化,有一個條件不滿足就會放棄某模塊的優化。
例如:
1 { 2 *y += *x; 3 *y += *x; 4 } 5 //上面的代碼會被優化為下面嗎? 6 { 7 *y += 2* *x; 8 }
不會,雖然適用一般情況y=y+2x。但是,當x=y時:y=4x 不是3x。編譯器會考慮所有特殊情況,保證安全。還有一種情況,是內存別名使用的時候兩個變量值不同,但是指針地址有可能相同。也不會優化.
函數調用也會妨礙優化,此時就是用內聯函數優化了。避免頻繁出棧入棧。
優化程序性能(CSAPP:5)