【程序性能调优】分析gprof 结果含义

1、gprof gprof-test gmon.out -p 得到每个函数占用的执行时间

  • % time                       :此函数使用的程序总运行时间的百分比。
  • cumulative seconds:此函数和上面列出的所有函数运行时间总和。
  • self seconds             :此函数的运行时间,这是这个list的主要排序依据。
  • calls           :该函数被调用的次数,如果这个函数被配置,否则此处是空白。(proflie:我理解的是在编译该函数时有-pg选项)
  • self Ts/call :每次调用该函数的平均时间,如果这个函数被配置,否则此处是空白(不同程序在此处显示的单位可能不同,会有s、ms、Ts)
  • total Ts/call:每次调用该函数及其所调用的子函数的平均时间,如果这个函数被配置,否则此处是空白(不同程序在此处显示的单位可能不同,会有s、ms、Ts)
  • name         :函数的名称。这是这个清单的次要排序。索引显示了函数在gprof清单中的位置。如果索引在圆括号中,它将显示如果要显示它,它将出现在gprof list中的何处。

2、gprof gprof-test gmon.out -q 得到call graph,包含了每个函数的调用关系,调用次数,执行时间等信息

这个表描述了程序的调用关系树,并根据每个函数及其子函数所花费的总时间进行排序。
该表中的每个条目由几行组成。在左侧空白处的索引号行列出了当前函数。上面的几行列出了调用这个函数的函数,下面的几行列出了这个函数调用的函数。

对于该函数,字段有以下含义:

  • index     :表的每个元素的唯一索引号。索引号是按数字排序的,显示在每个函数名旁边,因此更容易查找函数在表中的位置。
  • % time  :调用该函数及其所调用的子函数的“总”的时间的百分比。(注:由于不同的角度、选项所排除的函数等,这些数字加起来不等于100%。)
  • self        :该函数的总用时
  • children:该函数调用其子函数的总时间
  • called    :该函数被调用的次数。如果函数本身是递归调用的,那么这个数字只包含非递归调用,后面跟一个' +'和递归调用的数量。
  • name    :该函数的函数名。索引号在它后面显示。如果函数是循环,则循环号显示在函数名和索引号之间。

对于该函数的父函数,字段有以下含义:

  • self         :从执行该函数回到其父函数的时间,相当于该函数的self用时
  • children :从执行该函数调用其子函数后回到到其父函数的时间,相当于该函数的children用时
  • called    :"该函数被该父函数调用的次数"  /  "该函数被调用的总次数"。该函数的递归调用不包括在' /'后面的数字中,也就是说该函数被调用的总次数不包括递归调用的次数。
  • name     :父函数的函数名。父索引号在其后显示。如果父函数是一个循环的成员,则在函数名和索引号之间显示循环号。

注:如果无法确定函数的父函数,则在“name”字段中显示 "<spontaneous>",其他字段都为空白。

对于该函数的子函数,字段有以下含义:

  • self    :从调用该子函数直到回到该函数的时间,相当于该子函数的self用时。
  • children    :从调用该子函数及其调用其子函数后回到该函数的时间,相当于该子函数的children用时。
  • called    :"该函数调用该子函数的次数" / "该子函数被调用的次数"。子函数的递归调用不包括在' /'后面的数字中。
  • name    :这是子函数的函数名。子索引号在其后打印。如果子函数是循环的成员,则循环号将在函数名和索引号之间显示。

如果调用关系图中有任何循环(circle),则有一个循环作为一个整体的条目。这个条目显示了谁调用了这个循环(作为父母)以及这个循环的成员(作为孩子)。

“+”递归调用条目显示循环内部的函数调用数量,每个成员的调用条目显示该成员从循环中的其他成员调用该函数的次数。

 

 


版权声明:本文为qq_37206769原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。