序言
一定时间的输入的程序处理延时,现需测量程序中各个函数的耗时比例,找到性能瓶颈,使用gprof工具检测。
1. gprof的功能
gprof和oprofile对比
gprof:
GNU工具之一,默认linux系统中都带有这个工具
原理:编译时在每个函数的出入口加入profiling代码,运行时统计程序在用户态的执行信息,得到每个函数的调用次数,执行时间,调用关系等信息。
适用领域:
- gprof简单易懂,适合于查找用户级程序的瓶颈
- 对很多时间在内核态执行的程序,gprof不适合
oprofile:
开源的profiling工具,2.6内核以上支持SMP系统带有
原理:使用硬件调试寄存器来统计信息,进行profiling的开销比较小,而且可以对内核进行profiling。统计的信息包括:cache的缺失率,memory的访存信息,分支预测错误率等,这些信息gprof是得不到的,但是oprofile不能得到函数调用次数。
适用领域:oprofile稍显复杂,但是得到的信息更多,更适合调试系统软件
2. gprof的使用
此处只介绍gprof的使用,oprofile的使用可参考官方站点:http://oprofile.sourceforge.net/about/
gprof的使用流程:
编译链接时加上-pg选项。一般我们可以加在 makefile中,如果需要得到带注释的源码清单,需要加-g选项
运行可执行程序(程序正常退出会在运行目录下生成gmon.out文件)
gprof工具分析gmon.out文件
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:显示使用次数为零的例程
- 按照调用计数和累积时间计算
3. gprof的检测示例
添加-pg和-g选项
gcc -g -pg -o test test.c
或
gcc -o test test.c -pg -g
运行可执行程序再分析gmon.out文件
./test
gprof test gmon.out -b
- 需要把它和产生它的应用程序关联起来
- 使用不同命令查看不同选项
或统一执行分析
gprof -b ./test gmon.out
使用不同命令查看不同选项
执行后的一个例子:gprof test gmon.out -b
Acknowledgements:
http://www.cnblogs.com/StitchSun/articles/4286428.html
http://blog.youkuaiyun.com/garfier/article/details/12489953
http://blog.youkuaiyun.com/stanjiang2010/article/details/5655143
2017.08.04