《C 高階程式設計》之 編寫高效的C 程式

2021-04-14 01:38:43 字數 2564 閱讀 2203

第五部分 編寫高效的c++程式

本文基址:http://blog.csdn.net/cugxueyu/archive/2007/12/07/1923564.aspx

一、效能和效率概述

編寫高效的程式,需要在設計層次上做考慮,並在實現層次上考慮細節。(一定要在程式的生命週期已開始就考慮效能)

「編寫高效的c++程式」指要編寫能高效執行的程式,而不是高效地編寫程式,要學會如何節省使用者的時間,而不是節省你自己的時間。

1、實現高效的兩種方法

如果想編寫真正高效能的應用,就必須從設計一開始就考慮效率問題。設計級效率包括:選擇高效演算法,避免不必要的步驟和計算,而且要選擇適當的設計優化

2、c++是一種低效語言嗎

c++包括一些高階構造,如異常和虛方法,這些構造都相當的慢。

c++語言有乙個一般性的設計原則:如果不用它,就不必為之付出。(如果不使用虛方法,就不用付出使用虛方法的效能代價。)

二、語言級效率

好的優化編譯器可以自動完成某些語言級優化,請檢查編譯器文件,了解有關細節。

1、高效的處理物件

①、傳引用

物件應該很少按值傳遞給函式或方法。

總體來說,如果乙個函式要修改乙個物件,可以簡單的按引用傳遞物件;如果函式不會修改物件,則應按const引用來傳遞。

②、按引用返回

應當按引用從函式返回物件,以避免不必要的複製。(不能返回乙個區域性物件的引用和指標)。

③、按引用捕獲異常

應當按引用捕獲異常,避免額外的複製。[異常在效能方面是重量級的,因此在異常方面做小幅改進也會大大改善效率。]

④、避免建立臨時物件

很多情況下,編譯器會建立臨時的匿名物件。

⑤、返回值優化

按值返回物件的函式可能導致建立乙個臨時物件。[一般編譯器會把大多數情況下的臨時變數予以優化,這種優化稱為返回值優化]

2、不要過度使用高開銷的語言特性

從執行速度方面看,許多c++特性的開銷都很大,異常、虛函式、rtti(執行時型別識別)更是首當其衝。即使在程式中沒有顯式地使用異常和rtti特性,這個特性也會帶來效能開銷,僅僅是因為可能會用到這些特性,為了對此提供支援,都會在執行中增加額外的步驟。

[編譯器可以指定允許指定編譯程式的方式,即:編譯程式時根本不支援這些特性。]

如:linuxg++ 3.2.2

如果g++指定標誌來禁用異常:g++

-fon-exceptions test.cpp

如果g++制定標誌禁用rtti:g++

-fon-rtti test.cpp [編譯器會成功編譯,但是無法執行]。

3、使用內聯方法和函式

程式設計師的內聯請求只是對編譯器提出乙個建議,即使你想內聯某個函式,編譯器也可以拒絕內聯該函式。

另一方面,一些編譯器會在完成優化的步驟中,對適當的函式和方法進行內聯,即使這些函式沒有標記inline關鍵字。[編譯器文件查詢]

三、設計級效率

程式中的設計選擇對效能的影響遠遠超過了語言級選擇的影響。[選擇合適的演算法]

優化程式的三個設計技術:快取物件池執行緒池

1、盡可能快取

快取(caching)是指儲存有關內容以便將來使用,從而避免獲取或再次計算。

下面任務會很慢:

·磁碟訪問:如果會經常訪問乙個檔案,應該把檔案內容儲存在ram中。

·網路通訊

·數學計算

·物件分配[物件池]

·執行緒建立[執行緒池]

2、使用物件池

物件池技術可以避免在程式的生命週期中建立和刪除大量物件,如果知道程式需要同一型別的大量物件,而且物件的生命週期都很短,就可以為這些物件建立乙個池(pool進行快取。只要**中需要乙個物件,就可以向物件池申請,用完此物件後,要把它放回池中。物件池只建立一次物件,因此他們的建構函式只呼叫一次,而不是每次使用時都呼叫。

3、執行緒池

執行緒支援是特定於平台的。

四、測評分析[gprof、oprofile]

編寫高效的C 程式

本文說的是程式的執行效率,不是編寫程式的效率。提公升效率的兩種方式 語言層次的效率涉及盡量高效地使用語言,例如將按值傳遞物件改為按引用傳遞。這種做法只能達到這一步。更重要的是設計層次的效率,包括使用高效的演算法,避免不必要的步驟和計算,選擇恰當的設計優化。優化已有的 涉及用更好 更高效的演算法或資料...

C 高階程式設計之「反射」

一,定義 反射技術,能夠讓託管 在執行時檢視元資料以及 的各方面資訊。二,常用方法 1,獲取物件方法 必須以public修飾的方法,不包括建構函式 2,獲取物件屬性 3,獲取物件的父類 附示例 using system using system.collections.generic using s...

高效C 程式設計

推薦編寫c 的 風格,看似容易,堅持不易,且寫且珍惜!陳國林 1.版本和版本宣告 版本和版本檔案宣告位於標頭檔案和定義檔案的開頭,主要內容 1 版本資訊 2 檔名稱 識別符號 摘要 3 當前的版本號 作者 修改日期 4 版本歷史資訊 2.程式版式 1 在每個類宣告之後 每個函式定義之後都要加上乙個空...