Linux系统-耗时检测-gprof操作入门。
一定时间的输入的程序处理延时,现需测量程序中各个函数的耗时比例,找到性能瓶颈,使用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
函数执行耗时
函数调用图
函数名索引