您的位置:首页 > 编程语言 > C语言/C++

google开源的C++性能分析工具 - gperftools

2015-06-07 21:26 656 查看
[align=left]gperftools是Google提供的一套工具,其中的一个功能是CPU profiler,用于分析程序性能,找到程序的性能瓶颈。[/align]
[align=left]安装[/align]
[align=left]gperftools:http://code.google.com/p/gperftools/downloads/list[/align]
[align=left]libunwind:http://download.savannah.gnu.org/releases/libunwind/[/align]
[align=left]64位操作系统需要安装libunwind,官方推荐版本是libunwind-0.99-beta[/align]
[align=left]安装过程:./configure [--disable-shared] &&make && make install[/align]
[align=left]Graphviz是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形,gperftools依靠此工具生成图形分析结果。[/align]
[align=left]安装命令:yum install graphviz[/align]
[align=left] [/align]
[align=left]1.编译libunwind库[/align]
[align=left]因为使用的是X86_64的Linux系统,因此需要安装libunwind库。[/align]
[align=left]安装方法很简单,常见的configure,make,make install的套路。[/align]
[align=left]wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-beta.tar.gz[/align]
[align=left]tarxvzf libunwind-0.99-beta.tar.gz[/align]
[align=left]cd libunwind-0.99-beta[/align]
[align=left]./configure[/align]
[align=left]make[/align]
[align=left]makeinstall[/align]
[align=left]因为默认的libunwind安装在/usr/local/lib目录下,需要将这个目录添加到系统动态库缓存中。[/align]
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf

/sbin/ldconfig
libunwind的最新版本是1.0.1,那为什么
不选择最新版本呢?google
perftools的INSTALL文件中给了说明。版本低于0.99-beta的libunwind与preftools一起工作可能不正常,但是高于
0.99-beta的版本中可能包含一些与perftools不兼容的代码(因为libunwind会调用malloc,可能会导致死锁)。
libunwind在X86_64平台上和perftools有不少问题,不过不会影响核心的tcmalloc库,但是会影响perftools中的工
具,例如cpu-profiler,heap-checker,heap-profiler。
[align=left] [/align]
[align=left]2.编译google-perftools[/align]
[align=left]因为我们只需要tcmalloc功能,因此不编译google-perftools中的其他工具。[/align]
[align=left]wget http://gperftools.googlecode.com/files/google-perftools-1.9.1.tar.gz[/align]
[align=left]tarxvzf google-perftools-1.9.1.tar.gz[/align]
[align=left]cd google-perftools-1.9.1[/align]
[align=left]./configure --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --enable-minimal--disable-dependency-tracking[/align]
[align=left]make[/align]
[align=left]makeinstall[/align]
[align=left]/sbin/ldconfig[/align]
[align=left] [/align]
[align=left]用法[/align]
[align=left]1.目标程序中引入头文件<google/profiler.h>,链接libprofiler库,64位操作系统同时链接libunwind库,在需要分析代码的起点和终点调用ProfilerStart()函数和ProfilerStop()函数[/align]
[align=left]2.编译链接,运行程序[/align]
[align=left]分析输出[/align]
[align=left]pprof脚本用于分析profile文件并输出结果,包括文本和图形两种输出风格。[/align]
[align=left]例如:demo是目标程序,my.prof是profile文件[/align]
[align=left]生成文本风格结果:pprof --text ./demo my.prof >profile.txt[/align]
[align=left]生成图形风格结果:pprof --pdf ./demo my.prof > profile.pdf[/align]
[align=left]对于一个函数的CPU使用时间分析,分为两个部分:[/align]
[align=left]1.整个函数消耗的CPU时间,包括函数内部其他函数调用所消耗的CPU时间[/align]
[align=left]2.不包含内部其他函数调用所消耗的CPU时间(内联函数除外)[/align]
[align=left]关于文本风格输出结果[/align]
[align=left]序号[/align]

[align=left]说明[/align]

[align=left]1[/align]

[align=left]分析样本数量(不包含其他函数调用)[/align]

[align=left]2[/align]

[align=left]分析样本百分比(不包含其他函数调用)[/align]

[align=left]3[/align]

[align=left]目前为止的分析样本百分比(不包含其他函数调用)[/align]

[align=left]4[/align]

[align=left]分析样本数量(包含其他函数调用)[/align]

[align=left]5[/align]

[align=left]分析样本百分比(包含其他函数调用)[/align]

[align=left]6[/align]

[align=left]函数名[/align]

[align=left]关于图形风格输出结果[/align]
[align=left]1.节点[/align]
[align=left]每个节点代表一个函数,节点数据格式:[/align]
[align=left]Class Name[/align]

[align=left]Method Name[/align]

[align=left]local (percentage)[/align]

[align=left]of cumulative (percentage)[/align]

[align=left]local时间是函数直接执行的指令所消耗的CPU时间(包括内联函数);性能分析通过抽样方法完成,默认是1秒100个样本,一个样本是10毫秒,即时间单位是10毫秒;[/align]
[align=left]cumulative时间是local时间与其他函数调用的总和;[/align]
[align=left]如果cumulative时间与local时间相同,则不打印cumulative时间项。[/align]
[align=left]2.有向边[/align]
[align=left]调用者指向被调用者,有向边上的时间表示被调用者所消耗的CPU时间[/align]
[align=left]示例[/align]
[align=left]代码如下,可以看出,CPU消耗集中在func1()和func2()两个函数,func2()消耗时间约为func1()的两倍。[/align]
[align=left]#include <google/profiler.h>[/align]
[align=left]#include <iostream>[/align]
[align=left]using namespace std;[/align]
[align=left]void func1() {[/align]
[align=left] int i = 0;[/align]
[align=left] while (i < 100000) {[/align]
[align=left] ++i;[/align]
[align=left] } [/align]
[align=left]}[/align]
[align=left]void func2() {[/align]
[align=left] int i = 0;[/align]
[align=left] while (i < 200000) {[/align]
[align=left] ++i;[/align]
[align=left] } [/align]
[align=left]}[/align]
[align=left]void func3() {[/align]
[align=left] for (int i = 0; i < 1000; ++i) {[/align]
[align=left] func1();[/align]
[align=left] func2();[/align]
[align=left] } [/align]
[align=left]}[/align]
[align=left]int main(){[/align]
[align=left] ProfilerStart("my.prof"); // 指定所生成的profile文件名[/align]
[align=left] func3();[/align]
[align=left] ProfilerStop(); // 结束profiling[/align]
[align=left] return 0;[/align]
[align=left]}[/align]
[align=left]然后编译链接运行,使用pprof生成分析结果[/align]
[align=left]g++-o demo demo.cpp -lprofiler -lunwind[/align]
[align=left]pprof--text ./demo my.prof > output.txt[/align]
[align=left]pprof--pdf ./demo my.prof > output.pdf[/align]
[align=left]查看分析结果,程序是122个时间样本,其中,func1()是40个时间样本,约为400毫秒;func2()是82个时间样本,约为820毫秒。[/align]

[align=left]Total: 122 samples[/align]

82 67.2% 67.2% 82 67.2% func2

40 32.8% 100.0% 40 32.8% func1

0 0.0% 100.0% 122 100.0% __libc_start_main

0 0.0% 100.0% 122 100.0% _start

0 0.0% 100.0% 122 100.0% func3

0 0.0% 100.0% 122 100.0% main
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: