Date: 2018.9.4


1、Reference

​https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/​

​https://sourceware.org/binutils/docs/gprof/​

​https://baike.baidu.com/item/gprof/8995496​

2、perf tool

perf :Linux下系统性能调优工具.

系统级的性能优化,包括性能剖析和代码优化,性能剖析的关键在于找到程序耗时和瓶颈所在,这时就可以利用perf这把瑞士军刀了。

perf的功能是很强大的,

具体使用方法可以参考:​​https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/​

3、gprof tool
3.1、gprof简介

gprof: GNU提供的性能调试工具。可以打印出程序运行中各个函数消耗的时间。对于分析程序性能瓶颈很好帮助。

gprof是GNU profile工具,可以运行于linux、AIX、Sun等操作系统进行C、C++、Pascal、Fortran程序的性能分析,用于程序的性能优化以及程序瓶颈问题的查找和解决。通过分析应用程序运行时产生的“flat profile”,可以得到每个函数的调用次数,每个函数消耗的处理器时间,也可以得到函数的“调用关系图”,包括函数调用的层次关系,每个函数调用花费了多少时间。

3.2 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)。

3.3 gprof分析方法:

1、编译、链接时均加上-pg,生成demo;

2、执行生成gmon.out文件;

3、gprof分析前一步生成的gmon.out文件,查看生成 txt文件中各个函数所占比例;

$gprof  ./demo  gmon.out  > profile.txt

注: gprof只能在linxu64位下对可执行文件进行分析。

3.4 实例分析

为了进一步说明gprof的使用方法,

(1)对mpeg4开源编解码库xvid解码器中的各函数进行性能分析:

测试程序:解码器程序xvid_decraw

xvid的编译可以参见:​

在编译生成解码器xvid_decraw时需要修改对应makefile,在编译和链接时都加上-pg参数。

make
./xvid_decraw -i input.m4v
gprof ./xvid_decraw gmon.out >profile.txt

生成分析结果profile.txt:

【linux/Tools】Performance Profile Tools——perf and gprof_linux

性能分析结论:

从分析结果可知,transfer8x8_copy_c函数占比42%,decode_pframe函数占比28%,get_inter_block_h263函数占比114%,get_pmv2函数占比14%,这几个函数的占比较大,通过优化这几个函数可以显著提升性能。由此看出插值,反dct等模块的复杂度是很高的。

(2)对H264标准开源编码器x264中的各个函数进行性能分析:

测试程序: x264

x264的编译可以参考:​

./configure
对configure之后生成的config.mak中的CFLAGS和LDFLAGS增加-pg选项,另外需要去掉-fomit-frame-pointer选项
make
./x264 -o out.264 input.yuv
gprof ./x264 gmon.out >profile.txt

生成分析结果profile.txt:

【linux/Tools】Performance Profile Tools——perf and gprof_linux_02

性能分析结论:

主要耗时的函数有:

get_ref

x264_pixel_satd_8x4

x264_pixel_satd_x4_16x16

x264_pixel_satd_x4_8x8

mc_chroma

说明对于编码器,运动估计的复杂度是很高的。

gprof 产生的信息解释:

%time

Cumulatve seconds

Self Seconds

Calls

Self TS/call

Total TS/call

name

该函数消耗时间占程序总时间百分比

程序的累积执行时间

该函数本身执行时间

函数被调用次数

函数平均执行次数

函数平均执行时间

函数名


THE END!