为了了解程序的执行时间以及各个函数之间的调用关系,能够经过Google的gperftool来统计函数之间的关系以及时间信息。经过分析每一个函数的时间信息,就能够看程序的关键消耗点在什么地方。sql
1. 安装网络
gperftools:http://code.google.com/p/gperftools/downloads/list多线程
libunwind:http://download.savannah.gnu.org/releases/libunwind/函数
64位操做系统须要安装libunwind,官方推荐版本是libunwind-0.99-beta工具
安装过程:./configure [--disable-shared] && make && make installpost
Graphviz是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形,gperftools依靠此工具生成图形分析结果。google
安装命令:yum install graphviz操作系统
2. 用法线程
1)在目标文件中加入#include <google/profiler.h>,在程序开始处加入ProfilerStart("my.prof"),在程序结束处加入ProfilerStop().code
2)在编译链接时,须要连接libprofiler库,64位操做系统同时连接libunwind库。
3)若是是在多线程中,能够采用下面的形式来控制:
#include <google/profiler.h> static int is_record = 0; if (is_record == 0) { ProfilerStart("my.prof"); } if (is_record == 0) { ProfilerStop(); is_record = 1; }
设置好上面的代码后,从新编译完成。直接运行便可。运行完成后就会生成my.prof文件。我在中间件pgoneproxy中增长后直接运行,就能够直接生成my.prof文件。可是在postgersql的psql的源码中增长后运行结束确不能生成。后面再网络上上面找到执行方式:env CPUPROFILE=./my.prof ./psql -h 127.0.0.1 -p 5432 -U db_user pgbench。安装这种执行方式确可以生成文件my.prof文件。
3. 分析输出
pprof脚本用于分析profile文件并输出结果,包括文本和图形两种输出风格。
例如:/urs/local/pgsql/bin/psql是目标程序,my.prof是profile文件
生成文本风格结果:pprof --text /urs/local/pgsql/bin/psql my.prof > profile.txt
生成图形风格结果:pprof --pdf /urs/local/pgsql/bin/psql my.prof > profile.pdf
4. 结果展现
下图是pgoneproxy中生成的pdf格式的结果的部分截图,从图片中能够看到每一个函数的调用关系以及每一个函数消耗的时间比例。