gprof介紹
gprof是GNU profiler工具。可以顯示程序運行的“flat profile”,包括每個函數(shù)的調(diào)用次數(shù),每個函數(shù)消耗的處理器時間。也可以顯示“調(diào)用圖”,包括函數(shù)的調(diào)用關(guān)系,每個函數(shù)調(diào)用花費了多少時間。還可以顯示“注釋的源代碼”,是程序源代碼的一個復(fù)本,標(biāo)記有程序中每行代碼的執(zhí)行次數(shù)。
為gprof編譯程序
在編譯或鏈接源程序的時候在編譯器的命令行參數(shù)中加入“-pg”選項,編譯時編譯器會自動在目標(biāo)代碼中插入用于性能測試的代碼片斷,這些代碼在程序在運行時采集并記錄函數(shù)的調(diào)用關(guān)系和調(diào)用次數(shù),以及采集并記錄函數(shù)自身執(zhí)行時間和子函數(shù)的調(diào)用時間,程序運行結(jié)束后,會在程序退出的路徑下生成一個gmon.out文件。這個文件就是記錄并保存下來的監(jiān)控數(shù)據(jù)。可以通過命令行方式的gprof或圖形化的Kprof來解讀這些數(shù)據(jù)并對程序的性能進(jìn)行分析。另外,如果想查看庫函數(shù)的profiling,需要在編譯是再加入“-lc_p”編譯參數(shù)代替“-lc”編譯參數(shù),這樣程序會鏈接libc_p.a庫,才可以產(chǎn)生庫函數(shù)的profiling信息。如果想執(zhí)行一行一行的profiling,還需要加入“-g”編譯參數(shù)。
例如如下命令行:gcc -Wall -g -pg -lc_p example.c -o example
Gprof基本用法:
1. 使用 -pg 編譯和鏈接你的應(yīng)用程序。
2. 執(zhí)行你的應(yīng)用程序使之生成供gprof 分析的數(shù)據(jù)。
3. 使用gprof 程序分析你的應(yīng)用程序生成的數(shù)據(jù)。
$gprof -b a.out gmon.out
Flat profile:
Each sample counts as 0.01 seconds.
no time accumulated
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
0.00 0.00 0.00 1 0.00 0.00 function
Call graph
granularity: each sample hit covers 2 byte(s) no time propagated
index % time self children called name
0.00 0.00 1/1 main [8]
[1] 0.0 0.00 0.00 1 function [1]
-----------------------------------------------
Index by function name
[1] function
gprof產(chǎn)生的信息
% the percentage of the total running time of the
time program used by this function.
函數(shù)使用時間占所有時間的百分比。
cumulative a running sum of the number of seconds accounted
seconds for by this function and those listed above it.
函數(shù)和上列函數(shù)累計執(zhí)行的時間。
self the number of seconds accounted for by this
seconds function alone. This is the major sort for this
listing.
函數(shù)本身所執(zhí)行的時間。
calls the number of times this function was invoked, if
this function is profiled, else blank.
函數(shù)被調(diào)用的次數(shù)
self the average number of milliseconds spent in this
ms/call function per call, if this function is profiled,
else blank.
每一次調(diào)用花費在函數(shù)的時間microseconds。
total the average number of milliseconds spent in this
ms/call function and its descendents per call, if this
function is profiled, else blank.
每一次調(diào)用,花費在函數(shù)及其衍生函數(shù)的平均時間microseconds。
name the name of the function. This is the minor sort
for this listing. The index shows the location of
the function in the gprof listing. If the index is
in parenthesis it shows where it would appear in
the gprof listing if it were to be printed.
函數(shù)名
命令格式
gprof [可執(zhí)行文件] [gmon.out文件] [其它參數(shù)]
方括號中的內(nèi)容可以省略。如果省略了“可執(zhí)行文件”,gprof會在當(dāng)前目錄下搜索a.out文件作為可執(zhí)行文件,而如果省略了gmon.out文件,gprof也會在當(dāng)前目錄下尋找gmon.out。其它參數(shù)可以控制gprof輸出內(nèi)容的格式等信息。最常用的參數(shù)如下:
l -b 不再輸出統(tǒng)計圖表中每個字段的詳細(xì)描述。
l -p 只輸出函數(shù)的調(diào)用圖(Call graph的那部分信息)。
l -q 只輸出函數(shù)的時間消耗列表。
l -e Name 不再輸出函數(shù)Name 及其子函數(shù)的調(diào)用圖(除非它們有未被限制的其它父函數(shù))。可以給定多個 -e 標(biāo)志。一個 -e 標(biāo)志只能指定一個函數(shù)。
l -E Name 不再輸出函數(shù)Name 及其子函數(shù)的調(diào)用圖,此標(biāo)志類似于 -e 標(biāo)志,但它在總時間和百分比時間的計算中排除了由函數(shù)Name 及其子函數(shù)所用的時間。
l -f Name 輸出函數(shù)Name 及其子函數(shù)的調(diào)用圖。可以指定多個 -f 標(biāo)志。一個 -f 標(biāo)志只能指定一個函數(shù)。
l -F Name 輸出函數(shù)Name 及其子函數(shù)的調(diào)用圖,它類似于 -f 標(biāo)志,但它在總時間和百分比時間計算中僅使用所打印的例程的時間。可以指定多個 -F 標(biāo)志。一個 -F 標(biāo)志只能指定一個函數(shù)。-F 標(biāo)志覆蓋 -E 標(biāo)志。
l -z 顯示使用次數(shù)為零的例程(按照調(diào)用計數(shù)和累積時間計算)。
不過,gprof不能顯示對象之間的繼承關(guān)系,這也是它的弱點.