根據網上信息整理所成。算法
功能與優劣
gprof實際上只是一個用於讀取profile結果文件的工具。gprof採用混合方法來收集程序的統計信息,它使用檢測方法,在編譯過程當中在函數入口處插入計數器用於收集每一個函數的被調用狀況和被調用次數;也使用採樣方法,在運行時按必定間隔去檢查程序計數器並在分析時找出程序計數器對應的函數來統計函數佔用的時間。須要注意的是,gprof統計的只是CPU的佔用時間,對I/O瓶頸貌似無能爲力,耗時甚久的I/O操做極可能只佔據極少的CPU時間。bash
使用
正常運行編譯好的程序,程序正常結束後會在當前目錄生成統計信息文件gmon.out,也就是說,程序必須正常退出(調用exit或從main中返回)才能生成統計信息。 當前目錄下若是有另外叫gmon.out的文件,內容將被本次運行生成的統計信息覆蓋,屢次運行統計程序前須要將前幾回的gmon.out更名。多線程
$ g++ main.cpp -pg -o main $ ./main # 會生成gmon.out性能分析文件 $ gprof -b main gmon.out > report.txt
這是基本使用方法,更加詳細的參見info gprof
。最終呈現的統計信息包括兩張表:flat table和call graph。flat table列出了各個函數的運行時間(不包括子函數)及所佔總運行時間的比率,函數的調用次數;call graph還包括函數之間的調用關係,詳細列出了每一個函數在它的各個子函數上所耗費的時間。函數
生成的信息與解釋
Flat Profile的數據解釋:工具
%time | Cumulative seconds | Self seconds | Calls | Self ms/call | Total ms/call | name |
---|---|---|---|---|---|---|
該函數消耗時間佔程序全部時間百分比 | 函數和上列函數累計執行時間(僅包括gprof可以監控到的函數) | 該函數自己執行時間(全部被調用次數的總共時間) | 函數被調用次數 | 函數平均執行時間 | 函數平均執行時間,包括其衍生函數 | 函數名 |
如何分析呢?性能
- 看%time列, 或者 "self ms/call"列, 這裏消耗時間最多的函數就是最耗費CPU的函數了. 也是最值得優化的函數了. (消耗僅統計函數自身的代碼消耗, 不統計子函數的消耗)
- 看"total ms/call"列, 找到包含子函數在內最耗時間的函數
- 從"self ms/call"列和"total ms/call"列對比可知, 若是self ms/call列的值很小,就能夠推測子函數消耗時間不少
通常Flat Profile的數據就夠算法競賽或者平常的小項目的分析了。若是須要Call Graph的分析,參考網上其餘的文章。優化
一些注意事項
- 一般gprof的採樣週期是0.01s,統計項越接近這個值偏差可能越大。若函數的運行時間低於0.01S,統計值會顯示爲0。
- 多線程下,gprof只能採集主線程性能數據。緣由是gprof採用ITIMER_PROF信號,在多線程內,只有主線程才能響應該信號。解決的關鍵是讓各個線程響應ITIMER_PROF信號,就是重寫pthread_create函數。
- 通常gprof只能查看用戶函數信息。若是想查看庫函數的信息,須要在編譯是再加入"-lc_p"編譯參數代替"-lc"編譯參數,這樣程序會連接libc_p.a庫,才能夠產生庫函數的profiling信息。