為了編寫高效的程序,需要在設計層次上做考慮,並在實現層次上考慮細節。(一定要在程序的生命週期已開始就考慮性能)。
“編寫高效的C++程序”指要編寫能高效運行的程序,而不是高效地編寫程序,要學會如何節省用戶的時間,而不是節省你自己的時間。
1、實現高效的兩種方法
如果想編寫真正高性能的應用,就必須從設計一開始就考慮效率問題。設計級效率包括:選擇高效算法,避免不必要的步驟和計算,而且要選擇適當的設計優化。
2、C++是一種低效語言嗎
C++包括一些高級構造,如異常和虛方法,這些構造都相當的慢。
C++語言有一個一般性的設計原則:如果不用它,就不必為之付出。(如果不使用虛方法,就不用付出使用虛方法的性能代價。)
好的優化編譯器可以自動完成某些語言級優化,請檢查編譯器文檔,瞭解有關細節。
1、高效的處理對象
①、傳引用
對象應該很少按值傳遞給函數或方法。
總體來說,如果一個函數要修改一個對象,可以簡單的按引用傳遞對象;如果函數不會修改對象,則應按const引用來傳遞。
②、按引用返回
應當按引用從函數返回對象,以避免不必要的複製。(不能返回一個局部對象的引用和指針)。
③、按引用捕獲異常
應當按引用捕獲異常,避免額外的複製。[異常在性能方面是重量級的,因此在異常方面做小幅改進也會大大改善效率。]
④、避免創建臨時對象
很多情況下,編譯器會創建臨時的匿名對象。
⑤、返回值優化
按值返回對象的函數可能導致創建一個臨時對象。[一般編譯器會把大多數情況下的臨時變量予以優化,這種優化稱為返回值優化]
2、不要過度使用高開銷的語言特性
從執行速度方面看,許多C++特性的開銷都很大,異常、虛函數、RTTI(運行時類型識別)更是首當其衝。即使在程序中沒有顯式地使用異常和RTTI特性,這個特性也會帶來性能開銷,僅僅是因為可能會用到這些特性,為了對此提供支持,都會在執行中增加額外的步驟。
[編譯器可以指定允許指定編譯程序的方式,即:編譯程序時根本不支持這些特性。]
如:Linux g++ 3.2.2
如果g++指定標誌來禁用異常:g++ -fon-exceptions test.cpp
如果g++制定標誌禁用RTTI:g++ -fon-rtti test.cpp [編譯器會成功編譯,但是無法運行]。
3、使用內聯方法和函數
程序員的內聯請求只是對編譯器提出一個建議,即使你想內聯某個函數,編譯器也可以拒絕內聯該函數。
另一方面,一些編譯器會在完成優化的步驟中,對適當的函數和方法進行內聯,即使這些函數沒有標記inline關鍵字。[編譯器文檔查詢]
三,設計效率
程序中的設計選擇對性能的影響遠遠超過了語言級選擇的影響。[選擇合適的算法]
優化程序的三個設計技術:緩存、對象池、線程池。
1、儘可能緩存
緩存(Caching)是指存儲有關內容以便將來使用,從而避免獲取或再次計算。
下面任務會很慢:
· 磁盤存取:如果會經常存取一個文件,應該把文件內容保存在RAM中。
· 網絡通信
· 數學計算
· 對象分配[對象池]
· 線程創建[線程池]
2、使用對象池
對象池技術可以避免在程序的生命週期中創建和刪除大量對象,如果知道程序需要同一類型的大量對象,而且對象的生命週期都很短,就可以為這些對象創建一個池(pool)進行緩存。只要代碼中需要一個對象,就可以向對象池申請,用完此對象後,要把它放回池中。對象池只創建一次對象,因此他們的構造函數只調用一次,而不是每次使用時都調用。
3、線程池
線程支持是特定於平臺的。
喜歡我的文章的話,就關注我吧!不要只收藏和轉發哦,每天至少兩篇編程知識給大家,都是本人多年的經驗總結!
閱讀更多 cpp軟件架構獅 的文章