|
沙发

楼主 |
发表于 2009-11-25 10:23:20
|
只看该作者
举例说明 gprof 使用方法
为了演示 gprof 程序,下面使用一个 gprof.c 文件:
#include <stdio.h>
void function1()
{
int i, j;
for (i = 0; i < 100000; i++)
j += i;
}
void function2()
{
int i, j;
function1();
for (i = 0; i < 200000; i++)
j = i;
}
int main()
{
int i, j;
for (i = 0; i < 100; i++)
function1();
for (i = 0; i < 50000; i++)
function2();
return (0);
} 这个程序有两个循环: function1() 100 次调用; function2() 调用 50 000 次。每个函数只执行简单的循环,但是每次调用 function2() 时,它会调用 function1() 。
为了使 gprof 能够执行,在编译程序时要使用 -pg 参数:
接着,运行生成的 gprof 文件,运行后会在同一目录下创建 gmon.out 调用图表简档文件:./gprof
beyes@beyes-groad:~/programming$ ls -al gmon.out
-rw-r--r-- 1 beyes beyes 424 2009-11-24 20:17 gmon.out
这时候,可以执行 gprof 程序,并且把结果保存到一个文件中:注意,上面命令中没有引用 gmon.out 文件!gprof 自动使用位于相同目录下的 gmon.out 文件。这里产生的 gprof.txt 是完整的 gprof 报告。
看一下 gprof.txt 中的内容,以下不把所有的内容列出,但会解释两个生成的简表样列。下面是第一个表:
![]()
图表解释:
%
time
表示两个函数在整个程序耗时中所占据的时间百分比。容易看到,function2() 占了 61.05% ,而 function1() 占了 38.95% 。
cumulative
seconds
累积时间。累积时间表示,这个函数在整个程序中的所有耗时,这个耗时包括独自运行时间以及被别的函数调用的运行时间。
self
seconds
自身独立运行时间。自身运行时间是指由主函数调用,单独的运行时间。function1() 独立运行时间为 12.43s ,它也被 function2() 调用,被 function2() 调用(50000次) 是 (31.91-12.43=19.48)s 。
self
被调用的次数。
self
us/call
自身独立运行所需平均时间,不包括里面所包含的子函数。
total
us/call
包括自身运行平均时间以及函数里面所包含子函数运行的平均时间。由 function2() 可以看到,它的 toal us/call 为 637.70us;它的 self us/call 为 389.60us ,而 function1() 的 self us/call 为 248.10 ,也就是 389.60 + 248.10 = 637.70 。
name
函数名
另一个简档如下图所示(显示各个函数的细分时间,以及函数是如何被调用的):
![]()
上图中:
index
表示要分析的索引号。这个索引号和后面要分析的函数所标示的数字 [x] 是一致的---为的是突出显示。
% time
是函数自身运行的时间与(函数自身运行时间+作为子函数被其他函数调用所花掉的时间)的比值。比如上面,function1() 自身运行时间是 12.43s ,它被 function2() 调用时,所花费的时间为 19.48s (也是 function2() 的时间),所以,这个比值就是 12.43/31.91=39.0% 。由于考虑到其他的一些因素,这个比值不会达到 100%,而会出现如 99.9% 这样的精确值。
self
函数自身所耗费时间。
children
函数中的子函数所耗费的时间。
called
被调用的次数。这里的次数有两个数值,用 / 号隔离开来。以上面图示说明:
当分析 function2() 时,它的这一栏为 50000 , 而 main 的这一栏为 50000/50000 。这表示 function2() 被调用了 50000 次,而从 main 的角度来看,在它看到的 50000 调用中(/ 号右边数值),function2() 被调用了 50000 次;
当分析 function1() 时,它的这一栏为 50100, 而 main 的这一栏为 100/50100 。这表示 function1() 在 main 看来,在 function1() 所发生的 50100 次的调用中,它直接看到的是 100 次;再看 function2() 这一栏表示为 50000/50100 ,也就是说,从 function2() 看过去,在 function1() 的 50100 次调用中,function1() 作为子函数,在它这里被调用了 50000 次。 |
|