文本模式有看起來像這樣的輸出線:
這將有很多線路,例如,收集的個人資料:
$ CPUPROFILE=a.pprof LD_PRELOAD=./libprofiler.so ./a.out
程序a.out
是相同的如下所示:Kcachegrind/callgrind is inaccurate for dispatcher functions?
然後用pprof分析它top
命令:
$ pprof ./a.out a.pprof
Using local file ./a.out.
Using local file a.pprof.
Welcome to pprof! For help, type 'help'.
(pprof) top
Total: 185 samples
76 41.1% 41.1% 76 41.1% do_4
51 27.6% 68.6% 51 27.6% do_3
37 20.0% 88.6% 37 20.0% do_2
21 11.4% 100.0% 21 11.4% do_1
0 0.0% 100.0% 185 100.0% __libc_start_main
0 0.0% 100.0% 185 100.0% dispatcher
0 0.0% 100.0% 34 18.4% first2
0 0.0% 100.0% 42 22.7% inner2
0 0.0% 100.0% 68 36.8% last2
0 0.0% 100.0% 185 100.0% main
那麼,這裏是什麼:總樣本數爲185;頻率是默認值(每10 ms 1個採樣;或每秒100個採樣)。那麼總運行時間是〜1.85秒。
第一列是a.out在給定函數中工作時採樣的數量。如果我們將其除以頻率,我們將得到給定函數的總時間估計,例如, do_4
運行爲〜0.8秒
第二列是在給定的函數的樣本計數由總計數劃分,或在總程序運行時間這個函數的百分比。所以do_4
是最慢的功能(總編程時間的41%),而do_1
只是程序運行時間的11%。我想你對這個專欄感興趣。
第三列是當前和前面行的總和;所以我們可以知道2個最慢的函數,do_4
和do_3
總計佔總運行時間的68%(41%+ 27%)
第四和第五列如同第一和第二列;但是這些不僅要考慮給定函數本身的樣本,還要考慮直接或間接從給定函數中調用的所有函數的樣本。你可以看到,main
和所有從它調用的是100%的總運行時間(因爲main
是程序本身;或程序的調用樹的根)和last2
與它的孩子是運行時的36.8%(其子程序在我的程序中:半呼叫do_4
和呼叫的一半到do_3
= 41.1 + 27.6/2 = 69.7/2〜= 34%+的功能本身)
PS一段時間:還有一些其他有用pprof命令,如callgrind
或gv
,其顯示添加了分析信息的呼叫樹的圖形表示。