關於C++程式碼最佳化的方法總結(轉)
關於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) 把宣告放在合適的位置上
在一些場合,透過移動宣告到合適的位置所帶來的效能提升應該引起我們足夠的重視。例如:
一. 最佳化之前
在進行最佳化之前,我們首先應該做的是發現我們程式碼的瓶頸(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/,如需轉載,請註明出處,否則將追究法律責任。
下一篇:
技術時評:Linux的應用之痛(轉)
請登入後發表評論
登入
全部評論
|
相關文章
- C++程式碼最佳化方法總結(一) (轉)C++
- C++程式碼最佳化方法總結(四) (轉)C++
- C++程式碼最佳化方法總結(三) (轉)C++
- C++程式碼最佳化方法總結(二) (轉)C++
- 關於C++ const 的全面總結C++
- 轉載關於JOIN總結
- C++ 層次程式碼最佳化 (轉)C++
- c++程式碼優化總結C++優化
- 關於查詢最佳化的一些總結
- 關於EffectIve C++ 的總結(侯捷翻譯版)C++
- 關於js程式碼位置的第一次總結JS
- 微課sql最佳化(17)、不改程式碼,最佳化SQL(1)-最佳化方法總結SQL
- 關於程式碼質量度量和分析的一些總結
- MySQL修改密碼方法總結 (轉)MySql密碼
- 關於近期的總結
- 關於UIWebView的總結UIWebView
- 關於BeautifulSoup的總結
- 關於HTML的總結HTML
- 關於 Go 程式碼結構的思考Go
- Delphi程式碼最佳化 完結篇 (轉)
- C\C++控制檯程式隱藏方法總結C++
- 關於中文亂碼問題(總結)
- 關於ES5陣列方法總結陣列
- 影象處理中關於孔洞填充的方法總結
- 方法及其最佳化技巧總結
- 關於查詢轉換的一些總結
- C++ 關於static variables的學習中遇到的問題總結C++
- sqlserver關於always on的總結SQLServer
- mysql關於variable的總結MySql
- ORACLE關於NULL的總結OracleNull
- 關於ORACLE鎖的總結Oracle
- 關於jboss配置的總結
- 關於SQL Server資料查詢基本方法的總結SQLServer
- 關於爛程式碼的那些事 – 評價程式碼優劣的方法
- 12C關於CDB、PDB建立AWR的方法和總結
- 關於修改資料庫名稱和ID的方法總結資料庫
- sqlserver關於mirror映象的總結SQLServer
- sqlserver 關於DBCC CHECKDB的總結SQLServer