C 語言特性中的效能分析

2021-09-30 08:42:36 字數 1592 閱讀 2613

**

這是一本關於c++效能優化的書,比較不錯,叫《c++應用程式效能優化》(第2版)

c++語言特性中的效能分析

大多數開發人員通常都有這個觀點,即組合語言和c語言適合用來編寫對效能要求非常高的程式。而c++語言的主要應用範圍是編寫複雜度非常高,但是對 效能要求不是那麼嚴格的程式。因為在大多數人看來,c++語言相對前面兩種語言來說,設計時因為考慮到要支援多種程式設計模式,比如物件導向程式設計和范型程式設計, 另外還有其他諸如例外處理等,從而引入了太多新的語言特性。而這些特性往往使得編譯器在編譯程式時,插入了很多額外的**。這樣不僅僅使得最終生成的二進 制**體積膨脹,而且使得執行速度下降。舉個例子說,比如開發人員只寫了"object obj;"這樣乙個簡單的語句。但在實際編譯時,如果object是乙個十分複雜的類,可能會引起很多操作,尤其是當構造還需要從堆中動態分配記憶體來放置 object中的成員變數物件時更是如此。

但是事實往往並非如此,很多時候,乙個程式的速度在框架設計完成時大致已經確定了,而並非因為採用了c++語言才使其速度沒有達到預期的目標。因此 當乙個程式的效能需要提高時,首先需要做的是用效能檢測工具對其執行的時間分布進行乙個準確的測量,找出關鍵路徑和真正的瓶頸所在,然後針對瓶頸進行分析 和優化,而不是一味盲目地將效能低劣歸咎於所採用的語言。事實上,如果框架設計不做修改,即使用c語言或者組合語言重新改寫,也並不能保證提高總體效能。

因此當遇到效能問題時,首先應檢查和反思程式的總體框架。然後用效能檢測工具對其實際執行做準確的測量,再針對瓶頸進行分析和優化,這才是正確的思路。

但不可否認的是,確實有一些操作或者c++的一些語言特性比其他因素更容易成為程式的瓶頸,一般公認的有如下因素。

(1)缺頁:如第5章中所述,缺頁往往意味著需要訪問外部儲存。因為外部儲存訪問相對於訪問記憶體或者**執行,有數量級的差別。因此只要有可能,應該盡量想辦法減少缺頁。

(2)從堆中動態申請和釋放記憶體:如c語言中的malloc/free和c++語言中的new/delete操作非常耗時,因此要盡可能優先考慮從 執行緒棧中獲得記憶體。優先考慮棧而減少從動態堆中申請記憶體,不僅僅是因為在堆中開闢記憶體比在棧中要慢很多,而且還與"儘量減少缺頁"這一宗旨有關。當執行程 序時,當前棧幀空間所在的記憶體頁肯定在物理記憶體中,因此程式**對其中變數的訪問不會引起缺頁;相反,從堆中生成的物件,只有指向它的指標在棧上,物件本 身卻是在堆中。堆一般來說不可能都在物理記憶體中,而且因為堆分配記憶體的特性,即使兩個相鄰生成的物件,也很有可能在堆記憶體位置上相隔很遠。因此當訪問這兩 個物件時,雖然分別指向它們指標都在棧上,但是通過這兩個指標引用它們時,很有可能會引起兩次"缺頁"。

(3)複雜物件的建立和銷毀:這往往是乙個層次相當深的遞迴呼叫,因為乙個物件的建立往往只需要一條語句,看似很簡單。另外,編譯器生成的臨時物件 因為在程式的源**中看不到,更是不容易察覺,因此尤其值得警惕和關注。本章中專門有兩節分別講解物件的構造和析構,以及臨時物件。

(4)函式呼叫:因為函式呼叫有固定的額外開銷,因此當函式體的**量相對較少,且該函式被非常頻繁地呼叫時,函式呼叫時的固定額外開銷容易成為不 必要的開銷。c語言的巨集和c++語言的內聯函式都是為了在保持函式呼叫的模組化特徵基礎上消除函式呼叫的固定額外開銷而引入的,因為巨集在提供效能優勢的同 時也給開發和除錯帶來了不便。在c++中更多提倡的是使用內聯函式,本章會有一節專門講解內聯函式。

C 語言特性效能分析

c 語言特性效能分析 c 語言特性引起效能方面的問題主要有 1 缺頁 涉及記憶體分配 2 從堆中動態申請和釋放記憶體 3 複雜物件的建立和銷毀 4 函式呼叫開銷 動態例子 object obj new object delete obj 繼續使用 指標obj是乙個區域性變數,在棧中分配。delete...

C 語言特性 1 影響效能的因素

大多數開發人員通常都有這個觀點,即組合語言和 c 語言適合用來編寫對效能要求非常高的程式。而 c 語言的主要應用範圍是編寫複雜度非常高的程式,但是對效能要求不是那麼嚴格的程式。但是事實往往並非如此,很多時候,乙個程式的速度在框架設計完成時大致已經確定了,而並非是因為採用了c 語言才使其速度沒有達到預...

針對C 語言特性的效能優化checklist

系列文章導航 新的職業目標,以及c 效能優化 針對c 語言特性的效能優化checklist 1 盡量使用棧記憶體,較少使用堆記憶體。2 將堆記憶體池化。3 函式引數使用const 或 傳遞類物件。4 短小的函式巨集化或inline化。5 將類成員變數的初始化放在初始化列表中。尤其是類中含有的物件的初...