gprof使用介绍【转】

转自:https://blog.csdn.net/linquidx/article/details/5916701

gprof

1.1 简介

gprof实际上只是一个用于读取profile结果文件的工具。gprof采用混合方法来收集程序的统计信息,他使用检测方法,在编译过程中在函数入口处插入计数器用于收集每个函数的被调用情况和被调用次数;也使用采样方法,在运行时按一定间隔去检查程序计数器并在分析时找出程序计数器对应的函数来统计函数占用的时间。

Gprof具有以下优缺点:

1) 优点:

a) GNU工具,人手一个;

b) 混合方法采集信息。

2) 缺点:

a) 需要编译选项支持:

i. 使用gcc/cc编译和链接时需要加入-pg选项

ii. 使用ld链接时需要用/lib/gcrt0.o代替crt0.o作为第一个input文件

iii. 如果要调试libc库需要使用-lc_p代替-lc参数

b) 调试多线程程序只能统计主线程的信息(所以不能用于kingbase)。

1.2 使用方法

1.2.1 编译程序

使用gcc/cc编译和链接时需要加入-pg选项

使用ld链接时需要用/lib/gcrt0.o代替crt0.o作为第一个input文件

如果要调试libc库需要使用-lc_p代替-lc参数

1.2.2 运行程序生成统计信息

正常运行编译好的程序,程序正常结束后会在当前目录生成统计信息文件gmon.out。

程序必须正常退出(调用exit或从main中返回)才能生成统计信息。

当前目录下如果有另外叫gmon.out的文件,内容将被本次运行生成的统计信息覆盖,多次运行统一程序请将前一次的gmon.out改名。

1.2.3 使用gprof查看统计结果

命令格式:

gprof options [executable-file [profile-data-files...]] [> outfile]

常用参数介绍:

symspec表示需要加入或排除的函数名,和gdb指定断点时的格式相同。

1) 输出相关:

a) -A[symspec]或--annotated-source[=symspec]:进行源码关联,只关联symspec指定的函数,不指定为全部关联。

b) -I dirs或--directory-path=dirs:添加搜索源码的文件夹,修改环境变量GPROF_PATH也可以。

c) -p[symspec]或--flat-profile[=symspec]:默认选项,输出统计信息,只统计symspec指定的函数,不指定为全部统计。

d) -P[symspec]或--no-flat-profile[=symspec]:排除统计symspec指定的函数

e) -q[symspec]或--graph[=symspec]:默认选项,输出函数调用信息,只统计symspec指定的函数,不指定为全部统计。

f) -Q[symspec]或--no-graph[=symspec]:排除统计symspec指定的函数

g) -b或--brief:不输出对各个参数含义的解释;

2) 分析相关:

a) -a或--no-static:定义为static的函数将不显示,函数的被调用次数将被计算在调用它的不是static的函数中;

b) -m num或--min-count=num:不显示被调用次数小于num的函数;

c) -z或--display-unused-functions:显示没有被调用的函数;

1.3 一个例子

编译测试文件:

gcc –g –o test test.c –pg

执行程序:

./test

查看统计信息:

gprof -b -A -p -q test gmon.out > pg

1.4 gprof产生的信息解析

% the percentage of the total running time of the time program used by this function. 函数使用时间占所有时间的百分比。 cumulative a running sum of the number of seconds accounted seconds for by this function and those listed above it. 函数和上列函数累计执行的时间。 self the number of seconds accounted for by this seconds function alone. This is the major sort for this listing. 函数本身所执行的时间。 calls the number of times this function was invoked, if this function is profiled, else blank. 函数被调用的次数 self the average number of milliseconds spent in this ms/call function per call, if this function is profiled, else blank. 每一次调用花费在函数的时间microseconds。 total the average number of milliseconds spent in this ms/call function and its descendents per call, if this function is profiled, else blank. 每一次调用,花费在函数及其衍生函数的平均时间microseconds。 name the name of the function. This is the minor sort for this listing. The index shows the location of the function in the gprof listing. If the index is in parenthesis it shows where it would appear in the gprof listing if it were to be printed. 函数名

1.4 结论

我们可以使用程序概要分析快速的找到一个程序里面值得优化的地方。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程技术专栏

static的使用总结

全局变量前加上关键字static,全局变量就定义成一个全局静态变量.,全局静态变量存储在静态存储区,在整个程序运行期间一直存在。全局静态变量在程序运行之前就存在...

9910
来自专栏Windows开发

支持定时任务的任务池

任务池可以用来异步处理任务,比如清理过期日志、HTTP请求,本文介绍的任务池还支持定时触发任务,在SetTimer得注意的两个坑 一文中介绍了工作线程如果想使用...

11220
来自专栏Windows开发

如何保证static变量只初始化一次

static变量分为两种情况:第一种是初始化为常量,在编译的时候就可以确定初始值;第二种是初始值在运行的时候才能确定,比如赋值为函数的返回值或 某个类的实例。

19710
来自专栏Windows开发

详解JsonCpp库的使用

JSON是一个轻量级数据交换格式,其可读性好,数据量比XML格式小,被广泛作为网络传输的数据格式。

50820
来自专栏Java架构学习路线

35个Java代码优化的细节,你知道几个?

代码 优化 ,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的...

11620
来自专栏编程技术专栏

extern关键字详解

extern放在变量或者函数之前,表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。

15310
来自专栏Windows开发

一个简单实用的线程基类

这篇文章介绍线程基类CThreadBase,其将线程资源封装成对象,提供生命周期控制接口,派生类覆盖相应的虚函数进行业务功能实现。

12840
来自专栏编程珠玑

C++中是如何调用C接口的?

如何在C++代码中调用写好的C接口?你可能会奇怪,C++不是兼容C吗?直接调用不就可以了?这里我们先按下不表,先看看C++如何调用C代码接口。

13010
来自专栏新智元

Linux28岁!开发者“诞生贴”下致谢Linux之父Linus

不知道是有意还是无意,今天的谷歌Group中,有网友将1991年8月26日Linus Torwalds发在社区中的公告贴挖了上来。MIT计算机科学与人工智能实验...

9710
来自专栏面朝大海春暖花开

c++计算1到100以内的质数

由于考试使用的是Dev-C++开发工具,为了下次考试做准备,改用该工具,直接下载安装即可,不会涉及到什么破解等

18420

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励