




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
性能分析工具 gprof 介绍Ver:1.0变更履历修改编号 版本 修改内容 修改人 修改日期目录1. GPROF 介绍 .42. 使用步骤 .43. 使用举例 .43.1 测试环境 .43.2 测试代码 .43.3 数据分析 .53.3.1 flat profile 模式 .63.3.2 call graph 模式 .74. 链接库中的函数 .75. 使用局限 .86. 分析示例 .12文件名称 版本:X.X.X-X.X.X 第 4 页1. gprof 介绍gprof是 GNU profile工具,可以运行于 linux、AIX、Sun 等操作系统进行 C、C+、Pascal、Fortran程序的性能分析,用于程序的性能优化以及程序瓶颈问题的查找和解决。通过分析应用程序运行时产生的“flat profile”,可以得到每个函数的调用次数,每个函数消耗的处理器时间,也可以得到函数的“调用关系图” ,包括函数调用的层次关系,每个函数调用花费了多少时间。2. 使用步骤1) 用 gcc、g+、xlC 编译程序时,使用-pg 参数,如果是 aCC 用 -G,如:g+ -pg -o test.exe test.cpp编译器会自动在目标代码中插入用于性能测试的代码片断,这些代码在程序运行时采集并记录函数的调用关系和调用次数,并记录函数自身执行时间和被调用函数的执行时间。2) 执行编译后的可执行程序,如:./test.exe。该步骤运行程序的时间会稍慢于正常编译的可执行程序的运行时间。程序运行结束后,会在程序所在路径下生成一个缺省文件名为 gmon.out的文件,这个文件就是记录程序运行的性能、调用关系、调用次数等信息的数据文件。3) 使用 gprof命令来分析记录程序运行信息的 gmon.out文件,如:gprof test.exe gmon.out 则可以在显示器上看到函数调用相关的统计、分析信息。上述信息也可以采用 gprof test.exe gmon.out gprofresult.txt重定向到文本文件以便于后续分析。3. 使用举例3.1 测试环境本文提供的样例的测试环境如下: Linux server164 2.6.9-22.ELsmp #1 SMP Mon Sep 19 18:32:14 EDT 2005 i686 i686 i386 GNU/Linux gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-47.3) GNU gprof 2.15.92.0.23.2 测试代码清单 1. 耗时测试应用程序示例example1.c文件名称 版本:X.X.X-X.X.X 第 5 页#include int a(void) int i=0,g=0;while(i+n“, argv0);exit(-1);elseiterations = atoi(argv1);printf(“No of iterations = %dn“, iterations);while(iterations-)a();b();这个应用程序包括两个函数:a 和 b,它们通过运行不同次数的循环来消耗不同的 CPU 时间。main 函数中采用了一个循环来反复调用这两个函数。函数 b 中循环的次数是 a 函数的 4 倍,因此我们期望通过 gprof 的分析结果可以观察到大概有 20% 的时间花在了 a 函数中,而 80% 的时间花在了 b 函数中。3.3 数据分析在 gcc 编译命令中加上 pg 参数即可。编译方法如下:文件名称 版本:X.X.X-X.X.X 第 6 页gcc example1.c -pg -o example1 -O2 -lc在编译好这个应用程序之后,按照普通方式运行这个程序:./example1 50000程序运行完之后,应该会看到在当前目录中新创建了一个文件 gmon.out。3.3.1 flat profile 模式使用 gprof 命令分析 gmon.out 文件,如下所示:gprof example1 gmon.out -p-p 参数标识“flat profile”模式,在分析结果中不显示函数的调用关系,AIX 平台默认此参数有效。输出以下内容:清单 2. flat profile 的结果Flat profile:Each sample counts as 0.01 seconds.% cumulative self self total time seconds seconds calls ms/call ms/call name 80.38 203.27 203.27 50000 4.07 4.07 b19.61 252.87 49.60 50000 0.99 0.99 a0.00 252.88 0.01 main上面结果中各个列的含义如下:%time 函数以及衍生函数(函数内部再次调用的子函数)所占的总运行时间的百分比 cumulative seconds 函数累计执行的时间self seconds 函数执行占用的时间calls 函数的调用次数self ms/call 每一次调用函数花费的时间 microseconds,不包括衍生函数的运行时间total ms/call 每一次调用函数花费的时间 microseconds,包括衍生函数的运行时间name 函数名称列的含义,在 gprof 的输出结果中都有详细的说明。从输出结果中可以看到,正如我们期望的一样,b 函数所花费的时间大概是 a 函数所花费的时间的 4 倍。很多函数调用(例如 printf)在上面的输出结果中都没有出现。这是因为大部分函数都是在 C 链接文件名称 版本:X.X.X-X.X.X 第 7 页库(libc.so)中,而链接库并没有使用 -pg 进行编译,因此就没有对链接库中的函数收集调度信息。3.3.2 call graph 模式如果希望反映函数之间的调用关系,需要采用如下命令:gprof example1 gmon.out q-q 参数标识“call graph”模式,在分析结果中显示函数的调用关系。输出以下内容:清单 3. Call graphgranularity: each sample hit covers 4 byte(s) for 0.00% of 252.72 secondsindex % time self children called name1 100.0 0.00 252.72 main 1201.41 0.00 50000/50000 b 251.31 0.00 50000/50000 a 3-201.41 0.00 50000/50000 main 12 79.7 201.41 0.00 50000 b 2-51.31 0.00 50000/50000 main 13 20.3 51.31 0.00 50000 a 3-上面结果中各个列的含义如下:index 每个函数第一次出现时都分配了一个编号,根据编号可以方便的查找函数的具体分析数据%time 函数以及衍生函数(函数内部再次调用的子函数)所占的总运行时间的百分比 self 函数的总运行时间children 衍生函数执行的总时间called 函数被调用的次数,不包括递归调用name 函数名称在 name 列中,可以看出函数之间的调用关系,main 函数调用 a、b 函数,b 函数被 main 函数调用,a 函数被 main 函数调用。通过函数名称后面的数字来标识这个文件中的函数,从而可以快速定位函数的分析数据的位置,经过一层层的逐步深入的分析就得到各个函数的调用关系以及各个函数的性能数据。4. 链接库中的函数正如在前面曾经介绍的,对于代码剖析的支持是由编译器增加的,因此如果希望从链接库(比如文件名称 版本:X.X.X-X.X.X 第 8 页libc.a)中获得剖析信息,就需要使用 -pg 来编译这些库。很多操作系统默认提供了已经启用代码剖析支持而编译的链接库版本,例如:libc.a 对应的采用-pg 编译的文件为 libc_p.a。对于没有按照标准提供类似libc_p.a 链接库的操作系统版本来说,就需要安装已经编译好的启用代码剖析的链接库版本或者自己下载链接库的源代码进行编译。使用“启用代码剖析的链接库版本”的应用场景,举例如下:gcc example1.c -g -pg -o example1 -O2 -lc_p然后,像普通情况下一样运行 gprof 对 gmon.out 进行分析,可以获得 flat profile 或 call graph,而此时的分析结果会非常丰富,包含很多 C 的标准库函数的调用信息,例如:printf、write 等。注意:上例的 libc_p.a 是静态链接库。gprof 目前还不支持对动态链接库中的函数进行性能分析。5. 使用局限gprof 的特点是它只能分析应用程序在运行过程中所消耗掉的 CPU 时间,只有当应用程序的函数消耗CPU 的时候,gprof 才能够获取函数的性能数据。如果应用程序在运行过程中暂时挂起,并在系统内核唤醒应用程序后进一步执行,那么在应用程序中间暂停的时间性能数据是无法统计的;而且在应用程序等待 I/O 操作返回的时间,性能数据也是无法统计的。如果对清单 1 稍加修改,就可以清楚地看出这个问题:清单 5. 为清单 1 添加 sleep()函数调用example2.c:#include int a(void)sleep(1); /*调用系统函数进行 sleep*/return 0;int b(void)sleep(4); /*调用系统函数进行 sleep*/return 0;int main(int argc, char* argv)int iterations;if(argc != 2)文件名称 版本:X.X.X-X.X.X 第 9 页printf(“Usage %s n“, argv0);exit(-1);elseiterations = atoi(argv1);printf(“No of iterations = %dn“, iterations);while(iterations-)a();b();现在 a 函数和 b 函数不再处理繁忙的循环了,而是分别调用 sleep()来挂起 1 秒和 4 秒。使用“启用代码剖析的链接库版本” ,编译这个应用程序:gcc example2.c -g -pg -o example2 -O2 -lc_p并让这个应用程序循环 30 次:./example2 30执行 gprof example2 gmon.out p 所生成的结果如下:清单 6. flat profile 显示了系统调用的结果Flat profile:Each sample counts as 0.01 seconds.no time accumulated% cumulative self self total time seconds seconds calls Ts/call Ts/call name 0.00 0.00 0.00 21 0.00 0.00 _IO_file_overflow0.00 0.00 0.00 13 0.00 0.00 strncmp0.00 0.00 0.00 8 0.00 0.00 memset0.00 0.00 0.00 8 0.00 0.00 sigprocmask0.00 0.00 0.00 7 0.00 0.00 getenv0.00 0.00 0.00 6 0.00 0.00 memcpy0.00 0.00 0.00 5 0.00 0.00 _int_malloc0.00 0.00 0.00 5 0.00 0.00 malloc文件名称 版本:X.X.X-X.X.X 第 10页0.00 0.00 0.00 5 0.00 0.00 sigaction0.00 0.00 0.00 5 0.00 0.00 strsep0.00 0.00 0.00 4 0.00 0.00 nanosleep0.00 0.00 0.00 4 0.00 0.00 sleep0.00 0.00 0.00 4 0.00 0.00 strpbrk0.00 0.00 0.00 3 0.00 0.00 _IO_new_file_xsputn0.00 0.00 0.00 3 0.00 0.00 _strtoul_l_internal0.00 0.00 0.00 3 0.00 0.00 _cxa_atexit0.00 0.00 0.00 3 0.00 0.00 _strtoul_internal0.00 0.00 0.00 2 0.00 0.00 _errno_location0.00 0.00 0.00 2 0.00 0.00 _find_specmb0.00 0.00 0.00 2 0.00 0.00 a0.00 0.00 0.00 2 0.00 0.00 b0.00 0.00 0.00 2 0.00 0.00 mempcpy0.00 0.00 0.00 1 0.00 0.00 _IO_default_xsputn0.00 0.00 0.00 1 0.00 0.00 _IO_doallocbuf0.00 0.00 0.00 1 0.00 0.00 _IO_file_doallocate0.00 0.00 0.00 1 0.00 0.00 _IO_file_stat0.00 0.00 0.00 1 0.00 0.00 _IO_file_write0.00 0.00 0.00 1 0.00 0.00 _IO_setb0.00 0.00 0.00 1 0.00 0.00 _strtol_l_internal0.00 0.00 0.00 1 0.00 0.00 _fxstat640.00 0.00 0.00 1 0.00 0.00 _init_misc0.00 0.00 0.00 1 0.0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 45696-2025公共汽电车场站分类及等级划分
- 2025年新材料技术考试卷及答案
- 2025年网络与信息安全工程师考试试题及答案
- TWS119-Standard-生命科学试剂-MCE
- SHP099-Standard-生命科学试剂-MCE
- 2025年口腔医学专业成人教育考试试卷及答案
- 2025年环境工程师职业水平考试试卷及答案
- 2025年个人理财与投资分析专业期末考试内容及试卷及答案
- 梦想成真追逐梦想的演讲稿(5篇)
- 储备林建设管理实施方案
- 2023年养老服务有限公司简介(4个范本)
- 红色文化知识竞赛试题及答案
- 老旧住宅屋面防水工程施工方案
- 操作规程储气罐安全操作规程
- 电厂物资管理系统解决方案
- 初一数学(下)难题百道及答案
- 七年级下实数及实数的计算
- 中国古典文献学(全套)
- 《抖音平台商品销售策略研究10000字(论文)》
- 两用物项-最终用户用途证明
- 2023-2024学年贵州省铜仁市小学数学五年级下册期末高分预测题
评论
0/150
提交评论