linux下程式效能優化

2021-06-14 16:58:54 字數 2109 閱讀 7986

一. 效能優化概述

•一般來說,程式效能不佳,有可能是如下三個原因:

–a.程式運輸量大,導致cpu過於繁忙,cpu是瓶頸

•解決辦法就是在裝置上執行top命令,如果某個程序的cpu利用率很高,則說明cpu是瓶頸。••

–b. 程式需要做大量的io,讀寫檔案,記憶體操作等,cpu更多是出於等待,i/o部分是系統的瓶頸。

•1.可以通過命令# vmstat 檢視當前系統虛擬記憶體以及快取使用情況,從而判斷應用程式是否占用了大量記憶體。

•2.也可以通過命令# iostat 詳細的監控磁碟的io狀態。

–程式之間互相等待,結果cpu利用率很低,但程式執行速度依然很慢,那麼程式之間的共享和死鎖制約了程式的效能。如果系統cpu利用率不高,那麼也不存在大量的io操作,那麼很可能是執行緒之間的相互等待造成的,這時需要對程式進行大概重構。

二. io 優化

•分析應用輸入源以及輸出物件

–一般來說,cpu暫存器訪問速度》l1,l2,l3快取》記憶體訪問》io訪問

–如果讀寫檔案較大時,我們可以考慮用多執行緒去讀寫該檔案,多執行緒可以大大降低檔案的讀寫時間

•考慮io物件的位置

•分析io物件的初始化以及清理過程

•減少非必要的io

三; 程式併發與負載均衡 

•分析應用執行緒之間的共享資源

•最小化資源的保持程式的併發和通訊 –

•多執行緒之間僅可能保持負載均衡

•在多核系統下由於linux核心排程器具有軟親和力(affinity)的特性,這意味這、著程序通常不會在處理器之間頻繁的切換。在實際應用中,如果不存在資料競爭的影響,應用的不同部分分布到不同的cpu上,可以帶來更高的收益。

四. 關鍵路徑分析

•分析業務處理流程,檢查關鍵路徑的潛在瓶頸。

•分析關鍵路徑上的函式呼叫,關注高耗時的函式以及異常呼叫頻率。

•使用oprofile實現應用效能監控。

•int main(int argc, char *argv) •

•}•int slow_multiply(x, y) •

•[root@localhost test]# gcc multiply.c -g -o multiply

•[root@localhost test]# opcontrol --init

•[root@localhost test]# opcontrol --vmlinux=/usr/src/linux-2.6.37.2/vmlinux

•[root@localhost test]# opcontrol --reset

•[root@localhost test]# opcontrol --start

•root@localhost test]# opcontrol --stop

•stopping profiling.

•[root@localhost test]# opcontrol --shutdown

•killing daemon.

•[root@localhost test]# opcontrol --deinit

•unloading oprofile module

•[root@localhost test]# opannotate --source ./multiply

•            

•  :{ /* slow_multiplytotal:     36 92.3077 */

•               :       int i, j, z;

•    2769.2308 :        for (i = 0, z = 0; i < x; i++)

•     820.5128:               z = z + y;

•     1 2.5641 :        return z; 

如上可知上述函式耗時較多。

五. 演算法及資料結構優化 

•分析程式中耗時多的演算法的複雜度,盡量降低程式的複雜度。

–如果程式中有個函式耗時呈指數級的增長,則要考慮改進演算法

–swith語句中根據發生的頻率來進行case排序

–用指標代替陣列

–用移位運算代替乘除運算

•分析資料結構記憶體對齊,字元以及二進位制的格式選用。

優化程式效能

編寫高效程式需要兩個活動 第一,我們必須選擇一組最好的演算法和資料結構 第二,我們必須編寫出編譯器能夠有效優化以轉換成高效可執行 的源 這裡,我們主要講述後者。首先,我們討論一下為什麼要編寫高效程式。不難想象,如果本來要用 天執行完的程式,經過優化只需要 天就可執行完,這是一件多麼令人振奮的 事啊。...

優化程式效能

l 消除迴圈的低效率 n 對於迴圈中的過程呼叫盡量移出迴圈外,例如 nfor i 0 i strlen s i strlen 函式為線性增長 在字串長度很大時 很消耗系統資源 n 減少不必要的儲存器引用,將儲存器引用儲存在臨時變數中.l 處理器優化 即充分利用儲存器流水線操作的吞吐量 n 迴圈展開,...

優化程式效能

研究彙編 是理解編譯器以及產生的 會如何執行的最有效的手段之一。編譯器優化 的限制 1 程式設計中存在 儲存器別名使用 的問題。編譯器必須假設不同的指標可能指向儲存器中相同的位置。2 函式呼叫 簡略了。具體看書 基本的編碼原則 效能大幅度提公升 優化程式效能的一些方法 1 將除錯完的程式完成編譯器級...