程序優化的5個方向

程序優化的5個方向

80/20法則:程序執行中,80%的時間消耗在20%的代碼上。
優化前,咱們首先得找到這20%的關鍵路徑;
各類語言都有專門的工具來找到這20%的關鍵路徑,好比C++常常用到的gprof;html

參考《C++的性能優化實踐》git

在關鍵路徑上對耗時的計算進行優化;
主要的優化方向爲:
減小重複計算、預先計算、延後計算、下降計算代價、不計算;github

減小重複計算

典型的例子如緩存,將以前相同的計算(查數據庫,讀寫文件)存下來,等待下一次繼續使用;
適用場景:計算結果有有效期,過段時間後須要再次計算;算法

預先計算

對於關鍵路徑中比較耗時的計算,預先計算出來,節省每次計算的成本;數據庫

  • 預先計算出對照表
    關鍵路徑中須要用到的映射關係對照表,將對照表預先計算,在關鍵路徑中直接取用;編程

  • 將計算提早到初始化期間
    好比,內存分配耗時,將其提早到初始化的時間分配,創建內存池;緩存

  • 將計算提早到編譯期間
    好比:使用常量表達式,在編譯期間將最終值計算出來,節省這部分的運行時開銷;
    相關技術:模版元編程;性能優化

適用場景:計算出來的值一直有效,無需再次計算;數據結構

延遲計算

將計算耗時延遲到後期,這樣,對於異常狀況或其它分支狀況,在中途就轉換,不用再計算;多線程

  • 有較多分支條件
    將最耗時的計算延後,這樣,可能不少場景在中途就轉到其它分支上,不用計算;

  • 判斷條件中的技巧:a||b a&&b
    若是判斷條件比較耗時,將更耗時的放在後面計算;這樣,對於a||b,當a成立時,b就不用再計算了;延遲計算的好處在於可能能夠不用計算;

適用場景:分支條件場景;

下降計算代價

這是一般能想到的最直接的優化手段,如何可以直接下降計算的代價;
- 內存申請從堆上改成棧上
動態內存分配昂貴,將內存分配從堆上改成棧上;

  • 下降靈活性,使用自定製版本的函數代替庫函數;

  • 使用更低級的指令或語言改寫;
    在C++中嵌入彙編語言;
    使用SSE2等指令集;

  • 使用更優的算法或數據結構;
    操做STL容器時,STL中的算法通常比本身手寫的算法要高效,儘可能使用STL的算法來替換咱們的手寫算法;
    參考:
    《STL區間成員函數及區間算法總結》
    《高效的使用STL》

適用場景:這類優化通常是以下降代碼可讀性爲代價的(STL的除外),用於優化的最後階段;

不計算

優化的終極方案,不計算;

  • 業務發現
    用不到的業務邏輯,廢棄的業務邏輯,仍然存在關鍵路徑中的還在執行的;痛快的刪除它;

  • 卻掉臨時對象開銷
    在咱們的代碼中,可能會有些臨時對象是不知不覺的,而消除臨時對象,將節省這部分開銷;
    參考:《消除臨時對象》

以上是單線程關鍵路徑的優化,接下來,咱們聊聊擴展到多核,在多線程上的優化;

推薦支持

若是你以爲本文對你有所幫助,請點擊如下【推薦】按鈕, 讓更多人閱讀;

Posted by: 大CC | 06AUG,2015
博客:blog.me115.com [訂閱]
Github:大CC

相關文章
相關標籤/搜索