- 浏览: 304108 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
syw19901001:
从入门到精通,不错。http://www.ihref.com/ ...
使用git进行版本控制 -
轻指飞扬:
...
一场程序员和老板的对话 -
luogen33:
ttttttttttttttttttttttttttttttt ...
lsmod -
luogen33:
ttttttttttttttttttt
lsmod -
vaqeteart:
嗯那
得到与享受
我的原文如下:
http://blog.chinaunix.net/u1/34500/showart_2144110.html
补充一下,cumulative seconds实际是:一个时间和,它的原始解释如下:
cumulative a running sum of the number of seconds accounted
seconds for by this function and those listed above it.
也就是说,第一行的self=cumulative
以后行的cumulative=self+上一行的cumulative
再补充一点,对于文中的红色"?",这样理解:
从某个函数A的子函数B返回到那个函数A所花费的时间,实际就是那个函数A在直接调用B、执行完B本身的代码(不含B的子函数)、并且返回A,这样的情况下所消耗的时间。
从某个函数A的子函数B的子函数C返回到那个函数所花费的时间,实际就是那个函数在调用B这个函数的时候、执行除了B之外的B函数的子孙C、最后返回到A所花费的时间。
说的似乎很复杂,实际直接看图自己理解,是很简单的,不要以为这个工具的输出有多么复杂,要以简单的思想来分析它的输出含义。
http://blog.chinaunix.net/u1/34500/showart_2144110.html
gprof [功能] gprof可以用来分析程序的性能. [描述] 常用的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 显示使用次数为零的例程(按照调用计数和累积时间计算)。 [举例] 关于gprof工具输出数据的含义解释: 假设有一个程序源文件hello.c内容如下: #include <stdio.h> static void my_print (char *); static void my_print2 (const char *); main () { char my_string[] = "hello world!"; my_print (my_string); my_print2 (my_string); my_print (my_string); } void count_sum() { int i,sum=0; for(i=0; i<10000000; i++) sum += i; } void my_print (char *string) { count_sum(); printf ("The string is %s ", string); } void my_print2 (const char *string) { char *string2; int size, i,sum =0; count_sum(); size = strlen(string); string2 = (char *) malloc (size + 1); for (i = 0; i < size; i++) string2[size -1 - i] = string; string2[size] = '\0'; for(i=0; i<50000000; i++) sum += i; printf ("The string printed backward is %s ", string2); } 1)编译生成可执行程序hello: gcc -pg -o hello hello.c 2)需要运行一下可执行程序hello以生成gprof分析需要的数据: $./hello 这样,会生成一个gmon.out文件供 gprof分析程序时候使用。 3)开始分析程序的执行时间: $gprof hello 输入之后,生成如下: 【片断一】 Flat profile: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls us/call us/call name 69.23 0.09 0.09 1 90000.00 103333.33 my_print2 30.77 0.13 0.04 3 13333.33 13333.33 count_sum 0.00 0.13 0.00 2 0.00 13333.33 my_print 这里,描述了所有函数的执行消耗情况,每一行将代表一个函数,每一列的标题占两行,含义如下: % time 时间百分比,表示执行此函数所占用的时间占程序总执行时间百分比(不含其调用函数的执行时间) cumulative seconds (包括此函数调用其它函数花费的时间) 累计秒数,表示执行此函数花费的时间(所有次执行的时间总和,不含其调用函数的执行时间) self 执行此函数花费的时间 seconds (调用其它函数花费的时间不计算在内) 此函数秒数,表示每次执行此函数花费的时间(仅一次执行,不含其调用函数的执行时间) calls 调用次数,表示此函数被调用了多少次 self us/call 此函数微妙数,表示每次调用此函数平均消耗的微秒时间(不包含此函数调用的子函数消耗时间)。 total us/call 总微妙数,表示每次调用此函数平均消耗的总共微秒时间(包含此函数调用的子函数消耗时间)。 name 函数名 【片断二】 Call graph (explanation follows) granularity: each sample hit covers 2 byte(s) for 3.95% of 0.25 seconds index %time self children called name <spontaneous> [1] 100.0 0.00 0.25 main [1] 0.16 0.03 1/1 my_print2 [2] 0.00 0.06 2/2 my_print [4] ----------------------------------------------- 0.16 0.03 1/1 main [1] [2] 76.0 0.16 0.03 1 my_print2 [2] 0.03 0.00 1/3 count_sum [3] ----------------------------------------------- 0.03 0.00 1/3 my_print2 [2] 0.06 0.00 2/3 my_print [4] [3] 36.0 0.09 0.00 3 count_sum [3] ----------------------------------------------- 0.00 0.06 2/2 main [1] [4] 24.0 0.00 0.06 2 my_print [4] 0.06 0.00 2/3 count_sum [3] ----------------------------------------------- *对于这个表(函数调用图),这个表描述了程序的函数调用关系,根据调用时间的大小对函数以及它的孩子们进行排序。 *对于这个表中的每一条记录(共4条记录),每条记录包含若干行。 *对于每一条记录中的行, 每一条记录中有一行(在最左面一列)被标上了index号,这一行的name列的函数就代表了本记录的当前函数; 每条记录内代表本记录函数的行之上的所有行,其name列的函数都是直接父函数(调用当前记录的函数的函数); 每条记录内代表本记录函数的行之下的所有行,其name列的函数都是直接子函数(被当前记录的函数调用的函数)。 *每一列,对于每一条记录来说的含义如下: index, 代表表中每一条记录的唯一的数字(键),标在该记录当前的函数所在行,根据数字大小顺序依次排列; 另外,每一个name列处的函数名字后面也紧跟着一个index号,代表该name的函数是属于哪个index值记录的当前函数。 % time, 代表记录中当前行函数及其所有子孙(?)孩子们所消耗的时间占程序总时间的百分比,由于有些函数被排除或者其他原因可能总和不是100%. self, 对于记录中当前函数行来说,代表执行本函数所消耗的时间(不包含它的所有子函数)。 对于记录中当前行上面行(父函数)来说,代表本函数返回到父函数花费了(父函数)多久的时间(不包括本函数的子函数所消耗的时间)。 对于记录中当前行下面行(子函数)来说,代表子函数返回到本函数花费了(本函数)多久的时间(不包括子函数的子函数所消耗的时间)。 children, 对于记录中当前函数行来说,代表本函数的所有子孙(?)函数返回到本函数所消耗(本函数)的时间。 对于记录中当前行上面行(父函数)来说,代表本函数所有子孙(?)返回到父函数,子孙们(?)消耗(父函数)的时间。 对于记录中当前行下面行(子函数)来说,代表子函数所有子孙(?)返回到本函数,那些子孙(?)消耗(本函数)的时间。 called, 对于记录中当前函数行来说,代表本函数被调用的次数,如果是递归函数则是非递归部分次数跟一个'+'号接递归调用次数。 对于记录中当前行上面行(父函数)来说,'/'左面代表该父函数调用该函数次数,'/'右面代表该函数总共被调用次数。 对于记录中当前行下面行(子函数)来说,'/'左面代表该函数调用该子函数次数,'/'右面代表该子函数总共被调用次数。 name, 对于记录中当前函数行来说,代表当前函数名加上其所属记录的index号,若该函数是某调用环一员,则环号放在函数名和index号之间。 对于记录中当前行上面行(父函数)来说,代表父函数名加其记录的index号,若父函数是某调用环一员,则环号放在父函数和index号之间。如果函数的父函数无法确定,那么在name字段打印一个`<spontaneous>'字符,并且所有其它字段为空(例如第一行)。 对于记录中当前行下面行(子函数)来说,代表子函数名加其记录的index号,若子函数是某调用环一员,则环号放在子函数和index号之间。 如果在调用图中存在任何环,那么会有一个记录来记录整个环。这个记录描述了环中谁做为谁的父函数调用了谁。环中,called字段'+'后指名了这个函数在环内部(递归)调用的次数,called字段其它部分(应该在+之前),指出环外函数对本函数的(非递归)调用次数。例如如下: index % time self children called name 0.16 0.03 1/1 main [2] [1] 100.0 0.16 0.03 1 my_print2 [1] 0.03 0.00 1/1 count_sum [3] ----------------------------------------------- <spontaneous> [2] 100.0 0.00 0.19 main [2] 0.16 0.03 1/1 my_print2 [1] 0.00 0.00 1/1 fact [4] ----------------------------------------------- 0.03 0.00 1/1 my_print2 [1] [3] 15.8 0.03 0.00 1 count_sum [3] ----------------------------------------------- 10 fact [4] 0.00 0.00 1/1 main [2] [4] 0.0 0.00 0.00 1+10 fact [4] 10 fact [4] ----------------------------------------------- 这里的fact就是阶乘的递归调用,代码我省略了。 -------- 这里红字部分了解的不透彻,不透彻所以看不懂,有谁能指导一下吗?
补充一下,cumulative seconds实际是:一个时间和,它的原始解释如下:
cumulative a running sum of the number of seconds accounted
seconds for by this function and those listed above it.
也就是说,第一行的self=cumulative
以后行的cumulative=self+上一行的cumulative
再补充一点,对于文中的红色"?",这样理解:
从某个函数A的子函数B返回到那个函数A所花费的时间,实际就是那个函数A在直接调用B、执行完B本身的代码(不含B的子函数)、并且返回A,这样的情况下所消耗的时间。
从某个函数A的子函数B的子函数C返回到那个函数所花费的时间,实际就是那个函数在调用B这个函数的时候、执行除了B之外的B函数的子孙C、最后返回到A所花费的时间。
说的似乎很复杂,实际直接看图自己理解,是很简单的,不要以为这个工具的输出有多么复杂,要以简单的思想来分析它的输出含义。
发表评论
-
关于C++中的'extern "C"'
2011-11-16 14:54 1973关于C++中的'extern "C& ... -
关于电源管理
2011-10-13 10:55 1288关于电源管理 主要内 ... -
使用rpm进行软件管理
2011-10-08 15:45 1929使用rpm进行软件管理 ... -
嵌入式开发交叉调试技术简介
2011-08-01 17:55 1850嵌入式开发交叉调试技术简介 本文主要介绍嵌入式开发环境中使用 ... -
yum使用总结
2011-07-27 14:46 6240yum [options] [command] [packag ... -
关于GNU GPL
2011-07-25 17:44 1924关于GNU GPL 这里简单介 ... -
Auto Tools基本使用
2011-07-14 16:57 1551Auto Tools基本使用 Auto Tools是基于GNU ... -
c中的int_short_char_long长度
2011-07-14 15:03 22421 记住如下原则: 2 ANSI C规定char类型一 ... -
关于C++中的类型转换操作符
2011-07-12 16:02 3853关于C++中的类型转换操 ... -
在Vim下绘制图形
2011-07-11 15:06 1957在Vim下绘制图形 Vim的Dra ... -
Linux中ELF格式文件介绍
2011-07-07 14:33 6661Linux中ELF格式文件介绍 E ... -
Linux系统中程序库文件简介
2011-07-05 18:16 3794Linux系统中程序库文件 ... -
BigEndian和LittleEndian
2011-07-04 18:06 995BigEndian和LittleEndian 首先了解一些概念 ... -
Samba服务配置和使用
2011-06-29 18:23 4017Samba服务配置和使用 简介 Samba服务可以用于在lin ... -
svn服务配置和基本应用
2011-06-27 17:20 1422svn服务配置和基本应用 [简介] svn(subvers ... -
tftp服务简单配置
2011-06-24 18:03 1481tftp服务简单配置 通过tftp服务可以在两台主机之间传输文 ... -
nfs服务器建立
2011-06-23 18:47 1243nfs服务器建立 本文介绍Linux环境下nfs服务的搭建过程 ... -
minicom使用总结
2011-06-20 18:09 7505minicom [功能] 串口通信程序。 [描述] *简介 ... -
w3m 使用总结
2011-06-20 11:45 25297w3m 使用总结 w3m是个开放源代码的命令行下面的网页浏览 ... -
mysql使用总结
2011-06-10 13:38 1049mysql使用总结 [描述] 这里简单介绍Linux下面mys ...
相关推荐
1. 显示调用图:gprof命令可产生被分析程序的执行概要文件,其中包括了被调用程序对调用者性能的影响。调用图数据取自于gmon.out文件,这是编译使用-G选项的程序时所创建的默认调用图分析文件。编译时,-G选项还会...
性能分析工具gprof应用详细介绍,性能分析工具gprof应用详细介绍,性能分析工具gprof应用详细介绍。
1. **Oprofile** `oprofile` 是一个系统级的性能分析工具,它可以对整个系统的动态执行进行采样,包括内核、库和用户空间的程序。`oprofile` 的优势在于其全面性,它能够跨进程、跨线程地分析性能,而且对硬件事件...
1. **运行gprof**:首先,你需要在编译代码时启用-g选项,以便编译器生成调试信息。然后,在运行程序时使用gprof收集性能数据。 2. **获取gprof输出**:gprof会生成一个以.gmon.out结尾的文件,其中包含了函数调用...
gprof.tar 需找程序热点,优化程序
GProf 是一个功能强大且易于使用的性能分析工具,可以帮助开发者快速识别出程序中的性能瓶颈,并对其进行优化。 GProf 使用了一种异常简单但是非常有效的方法来优化 C/C++ 程序。这种方法可以很容易地识别出值得...
1. 首先,你需要对你的Python程序进行gprof分析。这通常涉及到重新编译程序,并使用gprof的特殊选项运行它。 2. 然后,gprof会产生一个包含函数调用和时间数据的输出文件,通常是`gmon.out`。 3. 接下来,运行gprof2...
该脚本可以通过dot工具将gprof工具生成的诊断代码图形化。
gprof是GNU编译器工具包的一部分,通常在Linux系统中已经预装。它的主要功能是收集和分析程序运行时的统计信息,以便于优化代码效率。 gprof的两大核心特性是“flat profile”和“Call graph”。前者显示每个函数的...
gprof2dot linux环境下 C++性能测试工具 ,有助于查看程序的调用流程和次数.
gprof2dot, 将分析输出转换为点图形 关于 gprof2dot这是一个将多个分析器的输出转换为一个点图( )的python 脚本。它可以:从以下位置读取输出:Linux性能测试valgrind工具的 callgrindsysprofVTune放大器 XE
`gprof`全称是"GNU Profiler",它是GCC编译器套件的一部分,能够对程序进行静态和动态分析,生成详细的性能报告。要使用`gprof`,首先需要在编译时启用`-pg`选项,这会在目标文件中插入必要的计时信息。例如,编译...
在IT行业中,`gcov` 和 `gprof` 是两种非常重要的工具,它们主要用于C和C++程序的性能分析和代码覆盖率测试。`gcov_gprof.zip` 文件可能包含了一系列的教程、示例代码和使用指南,帮助用户理解和掌握这两个工具的...
1. **编译准备**:在编译时加入-g选项,以便为程序生成调试信息。同时,需要使用-gprof选项,这样编译器会插入必要的计时代码。 2. **运行程序**:运行带有-gprof编译选项的程序,gprof会在后台收集性能数据。 3. ...
gprof是GNU项目中的一款强大的性能分析工具,它能够帮助开发者对C、C++、Pascal、Fortran等语言编写的程序进行性能分析,以识别程序中的性能瓶颈。在Linux、AIX、Sun等操作系统上,gprof通过收集程序运行时的采样...
在C编程中,性能分析是优化程序的关键...总之,通过对C程序使用gprof进行性能分析,开发者能更好地理解程序运行的内在细节,找到性能瓶颈,从而提高程序效率。学习和掌握gprof的使用,对于提升C语言编程技能至关重要。