最近项目需要优化一些模块的性能,找了一些工具,发现 gperftools可以提供图形化的成果物,于是尝试使用 gperftools对程序的性能进行测试,但是参考网上教程在搭建环境的过程中总会有这样那样的问题,在这里记录一下我自己搭建该环境的过程,本文基于ubuntu 16.04搭建gperftools相关环境,亲测好用。
gperftools简介:
gperftools google推出的一个性能分析工具,相关介绍可见:
https://github.com/gperftools/gperftools/wiki
gperftools环境搭建:
1.安装基本编译环境,如果有些机器已经安装那么请忽略掉
(1)apt-get install autoconf automake libtool
2.安装libunwind库-这里安装的是1.5.0的版本
(1)首先下载该程序包,下载地址:http://download.savannah.gnu.org/releases/libunwind/
(2)下载之后解压文件:tar -xzvf libunwind-XXX.tar.gz
(3)进入文件目录之后执行:make && make install
3.安装图形化工具:graphviz
(1)apt-get install graphviz
4.安装gperftools工具
(1)去GitHub下载最新源码:https://github.com/gperftools/gperftools
(2)进入文件目录执行make && make install
至此gperftools环境已经搭建好了,下面看看该工具如何使用吧:
gperftools使用介绍:
在这里我只介绍一种方式,就是在程序中测试制定位置的源码性能,其余还有几种方式,大家可以参考wiki上面的相关文档。
1.在想要测试性能的地方加入 ProfilerStart("xxxx.prof"); ProfilerStop();代码
2.编译源码,加入链接库:-lprofiler -lunwind
3.执行程序
4.待程序结束之后敲入命令:pprof --pdf ./XXX XXX.prof > XXX.pdf 生成pdf文档。
gperftools案例介绍:
对如下代码进行性能测试:demo.c
#include <gperftools/profiler.h>
#include <stdio.h>
void func1()
{
int i = 0;
int j = 0;
for(i = 0;i < 1000;i++)
{
for(j = 0;j < 100000;j++)
{
;
}
}
}
void func2()
{
int i = 0;
int j = 0;
for(i = 0;i < 200;i++)
{
for(j = 0;j < 100000;j++)
{
;
}
}
}
void func3()
{
int i = 0;
int j = 0;
for(i = 0;i < 300;i++)
{
for(j = 0;j < 100000;j++)
{
;
}
}
}
void func4()
{
func1();
func2();
func3();
}
int main()
{
ProfilerStart("my.prof"); // 指定所生成的profile文件名
func4();
ProfilerStop(); // 结束profiling
}
编译代码:gcc -o demo demo.c -lprofiler -lunwind
运行代码:./demo
生成pdf文件:pprof --pdf ./demo my.prof > output.pdf
如下 的pdf:
小提示:如果代码执行的时间太短,生成pdf时会提示没有节点生成,并不是你的环境没有搭建好,而是代码运行太快了,该工具来不及统计!