• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2014-01-08)  Linux Linux编程问题 |   2 条评论  34 
    文章评分 0 次,平均分 0.0

    gperftools是Google提供的一套工具,其中的一个功能是CPU profiler,用于分析程序性能,找到程序的性能瓶颈。

    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 install

    Graphviz是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形,gperftools依靠此工具生成图形分析结果。
    安装命令:yum install graphviz

    2.用法

    1.目标程序中引入头文件,链接libprofiler库,64位操作系统同时链接libunwind库,在需要分析代码的起点和终点调用ProfilerStart()函数和ProfilerStop()函数
    2.编译链接,运行程序
    分析输出
    pprof脚本用于分析profile文件并输出结果,包括文本和图形两种输出风格。
    例如:demo是目标程序,my.prof是profile文件
    生成文本风格结果:pprof --text ./demo my.prof > profile.txt
    生成图形风格结果:pprof --pdf ./demo my.prof > profile.pdf

    对于一个函数的CPU使用时间分析,分为两个部分:
    1.整个函数消耗的CPU时间,包括函数内部其他函数调用所消耗的CPU时间
    2.不包含内部其他函数调用所消耗的CPU时间(内联函数除外)

    2.1关于文本风格输出结果

    序号 说明
    1 分析样本数量(不包含其他函数调用)
    2 分析样本百分比(不包含其他函数调用)
    3 目前为止的分析样本百分比(不包含其他函数调用)
    4 分析样本数量(包含其他函数调用)
    5 分析样本百分比(包含其他函数调用)
    6 函数名

    2.1关于图形风格输出结果

    1.节点
    每个节点代表一个函数,节点数据格式:
    Class Name
    Method Name
    local (percentage)
    of cumulative (percentage)
    local时间是函数直接执行的指令所消耗的CPU时间(包括内联函数);性能分析通过抽样方法完成,默认是1秒100个样本,一个样本是10毫秒,即时间单位是10毫秒;
    cumulative时间是local时间与其他函数调用的总和;
    如果cumulative时间与local时间相同,则不打印cumulative时间项。
    2.有向边
    调用者指向被调用者,有向边上的时间表示被调用者所消耗的CPU时间

    3.示例

    代码如下,可以看出,CPU消耗集中在func1()和func2()两个函数,func2()消耗时间约为func1()的两倍。

    #include <google/profiler.h>
    #include <iostream>
    using namespace std;
    void func1() {
        int i = 0;
        while (i < 100000) {
            ++i;
        }  
    }
    void func2() {
        int i = 0;
        while (i < 200000) {
            ++i;
        }  
    }
    void func3() {
        for (int i = 0; i < 1000; ++i) {
            func1();
            func2();
        }  
    }
    int main(){
        ProfilerStart("my.prof"); // 指定所生成的profile文件名
        func3();
        ProfilerStop(); // 结束profiling
        return 0;
    }

    然后编译链接运行,使用pprof生成分析结果

    g++ -o demo demo.cpp -lprofiler -lunwind
    pprof --text ./demo my.prof > output.txt
    pprof --pdf ./demo my.prof > output.pdf

    查看分析结果,程序是122个时间样本,其中,func1()是40个时间样本,约为400毫秒;func2()是82个时间样本,约为820毫秒。

    Total: 122 samples
          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

    参考文献

    使用 google-perftools 剖析程序性能瓶颈(包括安装):http://www.ibm.com/developerworks/cn/linux/l-cn-googleperf/

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/2948.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享