1. 程式人生 > >優化程序性能(CSAPP:5)

優化程序性能(CSAPP:5)

別名 並行 之間 結構 性能 增加 理解 可能 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)