分类:
2012-01-09 19:46:42
原文地址:用gprof分析程序性能 作者:kangle000
Gprof 实现原理:
通过在编译和链接你的程序的时候(使用 -pg 编译和链接选项),gcc 在你应用程序的每个函数中都加入了一个名为mcount ( or “_mcount” , or “__mcount” , 依赖于编译器或操作系统)的函数,也就是说你的应用程序里的每一个函数都会调用mcount, 而mcount 会在内存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调用图也保存了所有与函数相关的调用时间,调用次数等等的所有信息。
Gprof基本用法:
1. 使用 -pg 编译和链接你的应用程序。
2. 执行你的应用程序使之生成供gprof 分析的数据。
3. 使用gprof 程序分析你的应用程序生成的数据。
Gprof 简单使用:
让我们简单的举个例子来看看Gprof是如何使用的。
1.打开linux终端。新建一个test.c文件,并生用-pg 编译和链接该文件。 test.c 文件内容如下:
#include "stdio.h" #include "stdlib.h" void a(){ printf("\t\t+---call a() function\n"); } void c(){ printf("\t\t+---call c() function\n"); } int b(){ printf("\t+--- call b() function\n"); a(); c(); return 0; } int main(){ |
[linux /home/test]$gcc -pg test.c |
2.执行你的应用程序使之生成供gprof 分析的数据。 命令行里面输入:
[linux /home/test]$a.out main() function() +--- call b() function +---call a() function +---call c() function [linux /home/test]$ |
3.使用gprof 程序分析你的应用程序生成的数据。
命令行里面输入:
[linux /home/test]$ gprof -b a.out gmon.out | less |
% cumulative self self total Call graph granularity: each sample hit covers 4 byte(s) no time propagated index % time self children called name |
从上面的输出我们能明显的看出来,main 调用了 b 函数, 而b 函数分别调用了a 和 c 函数。由于我们的函数只是简单的输出了一个字串,故每个函数的消耗时间都是0 秒。
这是debug使用,发布时一定要去掉-pg选项,不然严重影响性能。