關於C 效能和效率的考量

2021-10-22 12:02:37 字數 962 閱讀 3329

一、關於「效率」的三個角度

1、支援封裝,可以實現相同介面來實驗不同演算法和資料結構效率的優劣

2、過多物件的構造和析構動作對效能的影響

3、程式庫的選擇

二、基本思想與手段

1、80-20法則

乙個程式的80%的資源用於20%的**上。

說明,軟體的整體效能由構成**的一小部分決定。

對於程式的效能瓶頸不能靠猜或者是直覺確定,否則會浪費大量的精力,因為程式的效能特性傾向高度的非直覺性。

需要通過觀察或者實驗來確定那些是20%部分的**,這得借助於程式分析器,比如gprof、valgrind等。

不用太在意細節**執行多少次,要看程式的響應時間,因為客戶討厭讓他們等待的程式。

程式分析器受限與它使用的資料,在測試時不要過度依賴與某組特定的測試資料,要盡可能使用多特性的測試資料來分析**效能。

2、採用拖延戰術

在有些場合可以延後計算,即lazy evaluation。比如,copy-on-write技術,在讀的時候共享資料,只在寫的時候複製副本進行寫操作。

用途:

使用場景:不使用於必須要計算的場合,適用與程式被要求執行某些計算,且這些計算可以避免的場合。

3、在要求被做之前把事情做下去

背後觀念:如果預期程式常常用到某個計算,可以利用新的資料結構降低每次計算的平均成本。比如,快取(caching)上次計算的中間結果;快取已經被訪問的資料庫資料,下次訪問時直接使用已被訪問過的資料。

4、儘量減少臨時物件的產生

所謂c++臨時物件是**中不可見的,由編譯器根據需要產生的無名物件。

產生時機:

5、使用其它的程式庫

需要針對性能瓶頸特性來選擇程式庫,同時需要從效率、擴充套件性、移植性、型別安全性等多維度考察。

6、c++物件導向特性支援成本

需要了解虛函式、多繼承、虛基類、執行時型別識別的成本。

如果需要這些特性的技能,我們就得承受這些成本。

構建高效能服務的考量

做一款網際網路產品,人們往往立馬就想到了海量使用者 海量資料 高併發 高效能。所以起初做架構設計時就把效能提到了乙個不得不做的地位。我個人是很反對這種 未雨綢繆 的方式的,因為對於乙個新應用來說獲取乙個網際網路使用者的成本並不小,而且 海量 不是短期內就會面臨的。所以請建議您最好先在基於投入產出比的...

構建高效能服務的考量

做一款網際網路產品,人們往往立馬就想到了海量使用者 海量資料 高併發 高效能。所以起初做架構設計時就把效能提到了乙個不得不做的地位。我個人是很反對這種 未雨綢繆 的方式的,因為對於乙個新應用來說獲取乙個網際網路使用者的成本並不小,而且 海量 不是短期內就會面臨的。所以請建議您最好先在基於投入產出比的...

mysql any 效率 關於mysql的效能優化

1.用 show status like value 查詢mysql資料庫效能 2.用 explain select from table 或 describe select from table 檢視執行計畫 3.使用索引 使用 like關鍵字時 like le 索引不起作用,但 like le ...