一. 效能優化概述
•一般來說,程式效能不佳,有可能是如下三個原因:
–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 將除錯完的程式完成編譯器級...