首页 > 其他分享 >GNU gprof分析C性能

GNU gprof分析C性能

时间:2023-06-02 21:34:14浏览次数:30  
标签:函数 GNU 性能 gprof 0.30 499999 62135400 nseq

参考

gprof的简单使用-anthony1983-ChinaUnix博客

Top (GNU gprof) (sourceware.org)

c - Enable and disable gprof at runtime? - Stack Overflow

gprof——GNU性能分析工具 - feisky - 博客园 (cnblogs.com)

Linux性能优化gprof使用 - youxin - 博客园 (cnblogs.com)

gprof介绍

GNU分析工具gprof可以有用的测量程序的性能,它记录了调用每个函数的次数以及在每个函数上花费的时间。

从gprof的输出可以容易的看出占用大量运行时间的函数。提高程序运行速度应该首先集中在那些占据费时的函数上。

使用方式

gprof [可执行文件] [gmon.out文件] [其它参数]

方括号中的内容可以省略。如果省略了“可执行文件”,gprof会在当前目录下搜索a.out文件作为可执行文件;

如果省略了gmon.out文件,gprof也会在当前目录下寻找gmon.out。

其它参数可以控制gprof输出内容的格式等信息,最常用的参数如下:

  • -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:显示使用次数为零的例程(按照调用计数和累积时间计算)。

使用步骤

  1. 使用gcc/g++编译时,加参数-pg,比如gcc -pg -o test test.c
  2. 运行编译好的程序test,程序会产生gmon.out文件
  3. 使用gprof工具分析gmon.out文件,gprof ./test gmon.out。

测试代码:

#include <stdio.h>

/* Computes the length of Collatz sequences */
unsigned int step(unsigned int x)
{
    if (x % 2 == 0) {
        return (x / 2);
    } else {
        return (3 * x + 1);
    }
}

unsigned int nseq(unsigned int x0)
{
    unsigned int i = 1, x;
    if (x0 == 1 || x0 == 0)
        return i;
    x = step(x0);
    while (x != 1 && x != 0) {
        x = step(x);
        i++;
    }
    return i;
}

int main(void) 
{
    unsigned int i, m = 0, im = 0;
    for (i = 1; i < 500000; i++) {
        unsigned int k = nseq(i);
        if (k > m) {
            m = k;
            im = i;
            printf("sequence length = %u for %u\n", m, im);
        }
    }
    return 0;
}

编译、运行、测试:

$ gcc -pg -o gprof_test gprof_test.c
$ ./gprof_test
$ gprof ./gprof_test gmon.out -b
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls  ns/call  ns/call  name
 75.82      0.30     0.30 62135400     4.88     4.88  step
 20.22      0.38     0.08   499999   161.76   768.35  nseq
  2.53      0.39     0.01                             frame_dummy
  2.53      0.40     0.01                             main

                        Call graph


granularity: each sample hit covers 2 byte(s) for 2.47% of 0.40 seconds

index % time    self  children    called     name
                                                   <spontaneous>
[1]     97.5    0.01    0.38                       main [1]
                0.08    0.30  499999/499999        nseq [2]
-----------------------------------------------
                0.08    0.30  499999/499999  	   main [1]
[2]     95.0    0.08    0.30  499999         	   nseq [2]
                0.30    0.00 62135400/62135400     step [3]
-----------------------------------------------
                0.30    0.00 62135400/62135400     nseq [2]
[3]     75.0    0.30    0.00 62135400              step [3]
-----------------------------------------------
                                                   <spontaneous>
[4]      2.5    0.01    0.00                       frame_dummy [4]
-----------------------------------------------

Index by function name

   [4] frame_dummy             [2] nseq
   [1] main                    [3] step

测试结果

  • % time:当前函数占总的运行时间的百分比
  • cumulative seconds:函数和上列函数累计执行的时间,单位秒
  • self seconds:函数本身执行的时间
  • calls:函数被调用次数
  • self ms/call:每一次调用花费在函数的时间
  • total ms/call:每一次调用,花费在函数及其依赖函数的平均时间
  • name:函数名
$ gprof ./gprof_test gmon.out -b
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls  ns/call  ns/call  name
 75.82      0.30     0.30 62135400     4.88     4.88  step
 20.22      0.38     0.08   499999   161.76   768.35  nseq
  2.53      0.39     0.01                             frame_dummy
  2.53      0.40     0.01                             main

Call graph 信息解释:

  • index:索引值
  • % time:函数消耗时间占所有时间百分比
  • Self:函数本身执行时间
  • Children:执行子函数所用时间
  • Called:被调用次数
  • Name:函数名
index % time    self  children    called     name
                                                   <spontaneous>
[1]     97.5    0.01    0.38                       main [1]
                0.08    0.30  499999/499999        nseq [2]
-----------------------------------------------
                0.08    0.30  499999/499999  	   main [1]
[2]     95.0    0.08    0.30  499999         	   nseq [2]
                0.30    0.00 62135400/62135400     step [3]
-----------------------------------------------
                0.30    0.00 62135400/62135400     nseq [2]
[3]     75.0    0.30    0.00 62135400              step [3]
-----------------------------------------------
                                                   <spontaneous>
[4]      2.5    0.01    0.00                       frame_dummy [4]
-----------------------------------------------

Index by function name

   [4] frame_dummy             [2] nseq
   [1] main                    [3] step

缺点

  • 只能分析应用程序在运行过程中所消耗掉的用户时间,无法得到程序内核空间的运行时间。

    查看内核空间运行时间的方式,可以使用time命令:

    $ time ./test
    real    0m0.591s   实际运行时间
    user    0m0.498s  用户态运行时间
    sys     0m0.093s  内核态运行时间
    
  • 分析的执行时间不包括由于挂起和阻塞的时间,所以对于有大量阻塞调用和休眠挂起的程序,使用gprof进行分析,并不能很好的分析出程序瓶颈的所在。gprof以固定的周期对程序运行时间进行采样测量,当程序挂起时,gprof不会对程序进行采样测量。
    解决方式:如果只对某部分代码进行分析,可以在不需要进行分析的代码段调用moncontrol(0)关闭分析,然后在需要分析的代码段调用moncontrol(1)打开分析。

    extern void moncontrol(int);
    moncontrol(0);
    moncontrol(1);
    
  • 不支持动态库中的函数分析

标签:函数,GNU,性能,gprof,0.30,499999,62135400,nseq
From: https://www.cnblogs.com/mrlayfolk/p/17452924.html

相关文章

  • IDEA集成Java性能分析神器JProfiler
    阅读文本大概需要10分钟。《eclipse集成Java性能分析神器JProfiler》讲解了eclipse集成Jprofiler,这篇讲解一下IDEA如何集成JProfiler。1、在JProfiler中配置IDEA选择IDEA2019这里并不同于Eclipse选择Eclipse的安装目录。IDEA选择的是配置目录,啥为配置目录了呢?其实就是在配置JProfi......
  • linux 性能自我学习 ———— 不可中断进程和僵尸进程 [四]
    前言简单介绍一下不可中断进程和僵尸进程。正文先来看下进程的状态:那么这一列的状态是什么呢?R是Running或Runnable的缩写,表示进程在cpu的就绪队列中,正在运行或者正在等待运行。D是disksleep的缩写,也就是不可中断睡眠,一般表示进程正在跟硬件交互,并且交互过程不允......
  • wiredtiger引擎性能——比levelDB更牛叉!
    WE'VEJOINEDMONGODB! We'reproudtoannouncethatMongoDBhasacquiredWiredTiger,andwe'vejoinedtheMongoDBteam! WewillbedirectlyinvolvedinsupportingtheWiredTigerstorageengineinMongoDB3.0andwillcontinuetodevelopWire......
  • 恒创科技:提高国外云主机性能(Linux系统)的 4 个步骤
    ​随着外贸业务的兴起及不断发展,越来越多的企业和个人开始使用国外VPS云主机来部署自己的应用程序和网站。其中,Linux系统的国外VPS云主机创造了众多的可能性和功能,但仍有一些方法可以进一步提高LinuxVPS的整体性能。下面我们将通过简单的4个步骤告诉您如何实现它。......
  • eclipse集成Java性能分析神器JProfiler
    JProfiler是一款功能强大的Java开发分析工具,能帮助从事编程工作的朋友们分析你们的代码数据,确定内存泄漏并了解线程问题。1、下载JProfilerhttps://www.ej-technologies.com/download/jprofiler/files可以根据系统位数选择具体版本的JProfiler2、安装JProfiler下载绿色版本JPro......
  • 如何4天快速入门性能测试
    在现代软件开发中,性能测试是至关重要的步骤之一。它可以帮助我们确定系统的负载极限和稳定性,以确保应用程序和网站在高流量期间仍然能够正常运行。但是,性能测试通常需要大量的时间和资源,对于初学者而言可能会感到有些棘手。以下是4天快速入门性能测试的步骤,帮助您开始追踪应用程序......
  • 深度解密 TCP 协议(三次握手、四次挥手、拥塞控制、性能优化)
    作者:@古明地盆喜欢这篇文章的话,就点个关注吧,或者关注一下我的公众号也可以,会持续分享高质量Python文章,以及其它相关内容。:点击查看公众号楔子巨人的肩膀:公众号《小林coding》随着你工作经验的积累,你会越来越意识到底层网络协议的重要性。比如我们时时刻刻在使用的HTTP协议......
  • 执行计划缓存,Prepared Statement性能跃升的秘密
    摘要:一起看一下GaussDB(forMySQL)是如何对执行计划进行缓存并加速PreparedStatement性能的。本文分享自华为云社区《执行计划缓存,PreparedStatement性能跃升的秘密》,作者:GaussDB数据库。引言在数据库系统中,SQL(StructuredQueryLanguage)语句输入到系统后,一般要经历:词法语法解......
  • 如何4天快速入门性能测试
    在现代软件开发中,性能测试是至关重要的步骤之一。它可以帮助我们确定系统的负载极限和稳定性,以确保应用程序和网站在高流量期间仍然能够正常运行。但是,性能测试通常需要大量的时间和资源,对于初学者而言可能会感到有些棘手。以下是4天快速入门性能测试的步骤,帮助您开始追踪应用程序......
  • 为什么面试官这么爱问性能优化?
    笔者是一个六年前端,没有大厂经历,也没有什么出彩的项目,所以今年以来,前端现在这种行情下并没有收到多少面试,但是为数不多的面试中,百分之九十都问到了性能优化的问题,而且问题都出奇的一致:平时的工作中你有做过什么性能优化?对于这个问题其实我的内心os是(各位轻喷~):你们怎么都这么......