關於C++程式碼最佳化的方法總結(轉)

ba發表於2007-08-11
關於C++程式碼最佳化的方法總結(轉)[@more@]  最佳化是一個非常大的主題,本文並不是去深入探討效能分析理論,演算法的效率,況且我也沒有這個能力。我只是想把一些可以簡單的應用到你的C++程式碼中的最佳化技術總結在這裡,這樣,當你遇到幾種不同的程式設計策略的時候,就可以對每種策略的效能進行一個大概的估計。這也是本文的目的之所在。
  
  一. 最佳化之前
  
  在進行最佳化之前,我們首先應該做的是發現我們程式碼的瓶頸(bottleneck)在哪裡。然而當你做這件事情的時候切忌從一個debug-version進行推斷,因為debug-version中包含了許多額外的程式碼。一個debug-version可執行體要比release-version大出40%。那些額外的程式碼都是用來支援除錯的,比如說符號的查詢。大多數實現都為debug-version和release-version提供了不同的operatorew以及庫函式。而且,一個release-version的執行體可能已經透過多種途徑進行了最佳化,包括不必要的臨時物件的消除,迴圈展開,把物件移入暫存器,內聯等等。
  
  另外,我們要把除錯和最佳化區分開來,它們是在完成不同的任務。 debug-version是用來追捕bugs以及檢查程式是否有邏輯上的問題。release-version則是用來做一些效能上的調整以及進行最佳化。
  
  下面就讓我們來看看有哪些程式碼最佳化技術吧:
  
  二. 宣告的放置
  
  程式中變數和物件的宣告放在什麼位置將會對效能產生顯著影響。同樣,對ostfix和prefix運算子的選擇也會影響效能。這一部分我們集中討論四個問題:初始化v.s 賦值,在程式確實要使用的地方放置宣告,建構函式的初始化列表,refix v.s postfix運算子。
  
  (1) 請使用初始化而不是賦值
  
  在C語言中只允許在一個函式體的開頭進行變數的宣告,然而在C++中宣告可以出現在程式的任何位置。這樣做的目的是希望把物件的宣告拖延到確實要使用它的時候再進行。這樣做可以有兩個好處:1. 確保了物件在它被使用前不會被程式的其他部分惡意修改。如果物件在開頭就被宣告然而卻在20行以後才被使用的話,就不能做這樣的保證。2. 使我們有機會透過用初始化取代賦值來達到效能的提升,從前宣告只能放在開頭,然而往往開始的時候我們還沒有獲得我們想要的值,因此初始化所帶來的好處就無法被應用。但是現在我們可以在我們獲得了想要的值的時候直接進行初始化,從而省去了一步。注意,或許對於基本型別來說,初始化和賦值之間可能不會有什麼差異,但是對於使用者定義的型別來說,二者就會帶來顯著的不同,因為賦值會多進行一次函式呼叫----operator =。因此當我們在賦值和初始化之間進行選擇的話,初始化應該是我們的首選。
  
  (2) 把宣告放在合適的位置上
  
  在一些場合,透過移動宣告到合適的位置所帶來的效能提升應該引起我們足夠的重視。例如:
  
  
QUOTE:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-947436/,如需轉載,請註明出處,否則將追究法律責任。

關於C++程式碼最佳化的方法總結(轉)
請登入後發表評論 登入
全部評論

相關文章