Gprofile

说明: 使用g++编译也可以,亲测, gprof 命令根据不同参数生成不同的分析结果。

             比如: g++ -pg -g -o hello hello.cpp

一、GProfile简介

      GProfile是gcc的一个工具,用于对应用程序的测试。

      GProfile可以分析出函数的调用次数、函数的调用关系以及函数消耗的时间。

 

二、GProfile原理

      在编译和链接你的程序的时候,gcc 在你应用程序的每个函数中都加入了一个名为mcount ( or "_mcount" , or "__mcount" , 依赖于编译器或操作系统)的函数,也就是说你的应用程序里的每一个函数都会调用mcount, 而mcount 会在内存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调用图也保存了所有与函数相关的调用时间,调用次数等等的所有信息。 

     程序运行结束后,会在程序退出的路径下生成一个gmon.out文件,用来保存监控数据。从而通过gprof来解读数据对程序进行分析。

          

三、GProfile用法

      1、在编译时加入参数 -pg就可以打开GProfile的开关。

      2、gprof只查看用户函数信息,不能对库函数进行查看。 如果想查看库函数的信息,在编译时加入"-lc_p"编译参数代替"-lc"编译参数,这样程序会链接libc_p.a库,就可以查看库函数的信息了。 
  3、 gprof只能在程序正常结束退出之后才能生成程序测评报告,原因是gprof通过在atexit()里注册了一个函数来产生结果信息,任何非正常退出都不会执行atexit()的动作,所以不会产生gmon.out文件。如果你的程序是一个不会退出的服务程序,那就只有修改代码来达到目的。如果不想改变程序的运行方式,可以添加一个信号处理函数解决问题(这样对代码修改最少),例如: 
  static void sighandler( int sig_no ) 
  { 
  exit(0); 
  } 
  signal( SIGUSR1, sighandler ); 
  当使用kill -USR1 pid 后,程序退出,生成gmon.out文件。 

 

四、GProfile举例

     


#include <stdio.h> 
  int ppp(int a) 
  { 
     int i, b; 
     b = 0; 
     for(i = 0; i<1000000; i++) { 
        b++; 
     } 
     return 0; 
  } 

 


  int prime(int n) 
  { 
     int i, j, b; 
     b = 0; 
     for(i=2; i<n; i++) { 
         for(j = 0; j<1000000; j++) { 
              b++; 
         } 
         if(n%i == 0) 
           return 0; 
         return 1; 
        } 
   } 

 


   int main(void) 
   { 
      int i, n; 
      n = 1000; 
      for(i=2; i<=n; i++) { 
         if(prime(i)) { 
            ppp(i); 
         } 
      } 
      return 0; 
   } 

 


   编译程序:gcc -pg -o test test.c 
  运行源程序./test后会生成一个gmon.out的文件。 
   分析结果:gprof -b test gmon.out 
 

   

 

 五、GProfile对于结果的分析

      -b 不再输出统计图表中每个字段的详细描述。 
  -p 只输出函数的调用图(Call graph的那部分信息)。 
  -q 只输出函数的时间消耗列表。 
  -e Name 不再输出函数Name 及其子函数的调用图(除非它们有未被限制的其它父函数)。可以给定多个 -e 标志。一个 -e 标志只能指定一个函数。 
  -E Name 不再输出函数Name 及其子函数的调用图,此标志类似于 -e 标志,但它在总时间和百分比时间的计算中排除了由函数Name 及其子函数所用的时间。 
  -f Name 输出函数Name 及其子函数的调用图。可以指定多个 -f 标志。一个 -f 标志只能指定一个函数。 
  -F Name 输出函数Name 及其子函数的调用图,它类似于 -f 标志,但它在总时间和百分比时间计算中仅使用所打印的例程的时间。可以指定多个 -F 标志。一个 -F 标志只能指定一个函数。-F 标志覆盖 -E 标志。 
  -z 显示使用次数为零的例程(按照调用计数和累积时间计算)。 

      GProfile的详细请参考:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html

      这个文档对GProfile说的很详细,很好。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值