gprof
可以用來分析系統在執行時各函式呼叫的次數,耗時等情況,可以方便地幫助我們定位系統的瓶頸,同時也能讓我們知道
對程式的那個位置就行優化能夠帶來盡可能大的效能提公升。
gprof
優化尤其適用於
cpu、記憶體密集性的應用模組。
目前我們的
linux
主機上大多都安裝了
gprof
,詳細的引數等可以通過
man gprof
檢視。需要重點指出的是,目前我們線上的
gprof
對多執行緒的支援不好,直接呼叫只能得到主線程的相關呼叫情況。根據相關資料,原因為
gprof
採用itimer_prof
訊號,在多執行緒內,只有主線程才能響應該訊號。為此,需要做一些額外的工作。使用提供的
gprof-helper.c
,將其編譯為so庫
,命令為:
gcc -shared -fpic gprof-helper.c -o gprof-helper.so -lpthread -ldl
這個庫的作用實際上實現乙個
pthread_create
的鉤子程式,這樣我們在呼叫
pthread_create
函式的時候就會呼叫到這個庫中提供的
pthread_create
的函式,從而實現在多執行緒情況下統計執行時的相關資訊。
在實際使用中,方法比較簡單,在我們自己的程式的
makefile
檔案中,加上編譯的選項
-pg,
並加上那個動態鏈結庫。如
gcc -pg imbs_main.cpp ../gprof-helper.so $(include) $(ldflags) $(ldlibs)。
這樣在編譯後會生成乙個
a.out
檔案。這個檔案就是包含了相關統計功能的可執行檔案,和我們正常編譯的程式在對外行為上是完全一致的。
程式執行並「正常」退出後,會生成乙個
gmon.out
檔案,這個就是執行時的統計檔案。使用命令
gprof -b a.out gmon.out
就可以將最終我們
readable
的資訊輸出來。這些資訊可以作為我們優化的依據。
注意:上面提到的「正常」退出是指程式是按照自身的執行邏輯正常退出的,如果直接
killall -9
是不能得到統計結果的。而我們通常的程式都是在迴圈中長時間執行,所以,實際中採用了相應
sigterm
訊號的方式,使用
killall -s 15
,傳送sigterm
訊號給程式,程式中會有相應的函式捕捉該訊號,捕捉到該訊號後,置乙個退出標記,這樣我們就可以控制程式按照既定的邏輯在處理完一次完整的工作後正常的退出。
這又引出了另乙個問題,實際上我們現在上線程式,重啟程式的時候,通常都是使用
killall -9
來停止原有程式的。這實際上是存在較大風險的,舉例來說,如果程式在執行時存在一些持久化的操作,比如寫磁碟,同時,寫磁碟操作是多次完成,比如先寫資料、再寫索引等,這應該是乙個在邏輯上的原子操作,那麼
killall -9
的隨機性可能破壞其原子性,從而造成潛在的資料不一致,如在我們常用的
transfer
中就存在這種資料不一致的隱患。雖然出現的概率不是很高,但是,長期的積累這種不一致性是會慢慢體現出來的。
關於具體的優化,這個可能就不是一點篇幅就能寫得下了,提一些常見的經驗供參考。
1.迴圈次數很多的迴圈體內部,
這種優化是收益最高的一種優化之一。迴圈體內部節約
n條指令,最終收益將乘以迴圈次數。常見的如將迴圈體內不改變的變數移動到迴圈體外,多重迴圈巢狀時的順序問題。 2.
優化函式呼叫。這是優化提高非常明顯的一種方式,常見的方式如函式
inline
,這樣可以節約大量的函式呼叫的開銷,避免多次的壓棧出棧。
需要注意的是,如果
makefile
中不指定至少
-o優化,即使宣告為
inline
函式,編譯器也不會進行函式內聯。 3.
優化記憶體定址
,避免重複的記憶體定址。 4.
優化cpu
流水線的分支**的成功率。比如,如果當前存在有if~
else if
~else
語句,將滿足概率最高的條件放到靠前的位置不僅能減少判斷和跳轉指令的執行,還有利於
cpu在流水作業時分支**的成功率,提高指令的流水化。 3
和4單獨優化的提公升不會很大,但是如果是在大量的迴圈體內部,提公升就會被放大很多倍。
gprof工具使用
gprof會精確的給出函式被呼叫的時間和次數,給出函式呼叫關係 gprof使用 1.在編譯和鏈結階段加入 pg 2.重新編譯 3.執行生成的可執行程式,在可執行程式當前目錄下生成gmon.out 4.用 gprof 工具分析 gmon.out 檔案 gprof gwcap gmon.out p p引...
gprof使用介紹
gprof實際上只是乙個用於讀取profile結果檔案的工具。gprof採用混合方法來收集程式的統計資訊,他使用檢測方法,在編譯過程中在函式入口處插入計數器用於收集每個函式的被呼叫情況和被呼叫次數 也使用取樣方法,在執行時按一定間隔去檢查程式計數器並在分析時找出程式計數器對應的函式來統計函式占用的時...
gprof使用介紹 gcc pg
linux服務端程式設計,效能總是不可避免要思考的問題。而單機 嚴格的說是單核 單執行緒程式 嚴格的說是邏輯 又是所有複雜應用的基礎。所以,這塊的效能是整個應用的基礎。當遇到應用相應很慢的時候我們往往會疑問 這麼強勁的cpu到底在幹什麼,反應這麼慢。滿足你!linux下常用的效能工具就是跟gcc一起...