使用gprof,tcmalloc,pprof性能统计分析

一、前言

参考GPROF用户数手册:http://sourceware.org/binutils/docs-2.17/gprof/index.html

参考博客:http://blog.csdn.net/stanjiang2010/article/details/5655143

GPROF是GCC自带的性能测试工具,可以统计出各个函数的调用次数、时间、以及函数调用图。

二、教程

使用GRPOF分为三个步骤

(1)编译时候打开编译开关,-pg

(2)运行程序(程序一定要正常运行完毕才会生成性能报告)

(3)运行性能测试工具来生成报告。

1.编码

这里编写一个示例代码,随后对其进行性能测试

 
  1. //test_gprof.c

  2. #include<stdio.h>

  3.  
  4. void new_func1(void);

  5.  
  6. void func1(void)

  7. {

  8. printf("\n Inside func1 \n");

  9. int i = 0;

  10.  
  11. for(;i<0xffffffff;i++);

  12. new_func1();

  13.  
  14. return;

  15. }

  16.  
  17. static void func2(void)

  18. {

  19. printf("\n Inside func2 \n");

  20. int i = 0;

  21.  
  22. for(;i<0xffffffaa;i++);

  23. return;

  24. }

  25.  
  26. int main(void)

  27. {

  28. printf("\n Inside main()\n");

  29. int i = 0;

  30.  
  31. for(;i<0xffffff;i++);

  32. func1();

  33. func2();

  34.  
  35. return 0;

  36. }

 
  1. //test_gprof_new.c

  2. #include<stdio.h>

  3.  
  4. void new_func1(void)

  5. {

  6. printf("\n Inside new_func1()\n");

  7. int i = 0;

  8.  
  9. for(;i<0xffffffee;i++);

  10.  
  11. return;

  12. }

2.编译并执行

g++  -pg test_gprof.cpp test_gprof_new.cpp -o test_gprof


可以看到执行后会新生成一个gmon.out文件



3.运行性能测试工具

gprof test_gprof gmon.out
可以看到各种参数跃然于屏上

(1)flat profile,包括每个函数的调用次数,以及每个函数消耗的处理器时间

(2)call graph包括函数的调用关系,每个函数调用花费的时间

1.perftools

       google-perftool,它是由google开发的用来分析C/C++程序性能的一套工具,这里的性能分析主要包括内存和CPU两个方面,内存分析使用google-perftool所提供的tcmalloc,CPU分析使用它所提供的profiler。下面先分别介绍一下tcmalloc和profiler,然后再给出一些使用的例子,及一些使用时的注意事项。

2.详细介绍

(1)tcmalloc

       tcmalloc的全称是thread cache malloc,顾名思义,它是带有thread cache的内存管理工具。tcmalloc的主要优点有两个方面,一个是内存allocate/deallocate的速度,通常情况下它的速度比glibc所提供的malloc要快;另一个方面是小内存(< =32K)的管理,它的小内存是在thread cache里面管理的,一方面减少了加锁的开销,另一方面用来表示小内存所用的额外的空间也比较小,比较节省空间。因此,对于多线程下,经常小内存的allocation/deallocation的程序(尤其多线程下使用STL比较多的程序),可以尝试使用一下tcmalloc。
除了在allocate/deallocate内存时的优化外,tcmalloc还提供了heapcheck和heapprofile的功能。heap-check主要被用来检查程序中是否有内存泄露,在哪里泄露。tcmalloc另外一个功能是heap-profile。heap-profile,顾名思义,它就是描绘程序的heap轮廓,通过这样一个过程,我们就能知道,程序的heap里在每一时刻都有些啥东东。有了profile的结果,它可以帮助我们定位内存泄露,帮助我们发现一些频繁allocate内存的地方,以此来做一些优化。

(2)profiler

      profiler是由google-perftool所提供的用来做cpu-profile的工具。cpu-profile,它的主要功能就是通过采样的方式,给程序中cpu的使用情况进行“画像”,通过它所输出的结果,我们可以对程序中各个函数耗时情况一目了然。在对程序做性能优化的时候,这个是很重要的,先把最耗时的若干个操作优化好,程序的整体性能提升应该十分明显,这也是做性能优化的一个最为基本的原则—先优化最耗时的。

3.perftool的使用方式

关于google-perftool的使用,总体上来讲有以下三种方式:

(a)直接调用提供的api

这种方式比较适用于对于程序的某个局部来做分析的情况,直接在要做分析的局部调用相关的api即可。

(b)链接静态库

这种方式是最为常用的方式,后面会有详细的介绍。

(c)链接动态库

这种方式和静态库的方式差不多,但通常不推荐使用,除非使用者不想额外链一个静态库(因为链接静态库会增大binary的大小)的情况,可以考虑使用这种方式。

对于链接静态库的使用方式具体操作方式如下:

 
  1. (1)heap-checker

  2. gcc [...] -o myprogram -ltcmalloc

  3. env HEAPCHECK=normal ./myprogram

  4.  
  5. (2)heap-profiler:

  6. gcc [...] -o myprogram -ltcmalloc

  7. env HEAPPROFILE=./myprogram.hprof ./myprogram

  8.  
  9. (3)cpu-profiler:

  10. gcc [...] -o myprogram -lprofiler

  11. env CPUPROFILE=./myprogram.prof ./myprogram

4.可视化转换工具pprof      

      通过上面的方法,可以生成google-perftool原始的输出结果。另外,google-perftool还提供了一个叫pprof的工具,它是一个perl的脚本,通过这个工具,可以将google-perftool的输出结果分析得更为直观,输出为图片、pdf等格式。

      假设被分析的程序二进制文件名为codeTest,perftools工具的原始结果输出为MyProfile,那么可以将原始输出转化成更友好的结果展示,如下:

 
  1. #将perftools的原始输出转换成gv格式的可视化输出

  2. pprof --gv ./codeTest MyProfile

  3. #将perftools的原始输出转换成pdf格式的可视化输出

  4. pprof --pdf ./codeTest MyProfile > MyProfile.pdf

  5. pprof --text ./codeText MyProfile

      经过pprof转换格式后的可视化输出的形式可以是下面的样子:

猜你喜欢

转载自blog.csdn.net/XiaoWhy/article/details/82217816