• gprof


    gprof 可视化

    gprof 是 GNU 工具之一,它在编译的时候在每个函数的出入口加入了 profiling 的代码,运行时统计程序在用户态的执行信息,可以得到每个函数的调用次数,执行时间,调用关系等信息,简单易懂。适合于查找用户级程序的性能瓶颈,对于很多时间都在内核态执行的程序,gprof 不适合(内核调用分析可以考虑使用 strace)

    使用方法

    给 GNU Tools 传递 PG 选项,编译器和连接器都需要加上-pg 选项

    g++ -g -pg ...
    

    启动程序,待程序执行完成之后(可手动停止)将自动生成 gmon.out 文件,当前文件包含了函数调用信息

    以文本的形式显示调用分析

    示例命令:

    # pwd #/data/logs/tars/app_log
    gprof /usr/.../***Server gmon.out > t.txt
    

    输出示例:

    Flat profile:
    
    Each sample counts as 0.01 seconds.
      %   cumulative   self              self     total           
     time   seconds   seconds    calls  ms/call  ms/call  name    
      9.78      1.58     1.58 16852032     0.00     0.00  std::pair<std::_Rb_tree_iterator<std::pair<std::string const, YUAccessor::ProfileTag> >, bool> std::_Rb_tree<std::string, std::pair<std::string const, YUAccessor::ProfileTag>, std::_Select1st<std::pair<std::string const, YUAccessor::ProfileTag> >, std::less<std::string>, std::allocator<std::pair<std::string const, YUAccessor::ProfileTag> > >::_M_insert_unique<std::pair<std::string, YUAccessor::ProfileTag> >(std::pair<std::string, YUAccessor::ProfileTag>&&)
      9.56      3.13     1.55 219949847     0.00     0.00  tars::TarsInputStream<tars::BufferReader>::read(long&, unsigned char, bool)
    ......
    ......
    ......
    

    可视化方式

    安装工具

    # ubuntu
    sudo apt-get install python graphviz
    sudo pip install gprof2dot
    

    假设 t.txt 文件由上面的 gprof 生成,执行下面命令可以生成调用图

    gprof2dot -n 7 -s ./t.txt | dot -Tpng -o output_dg.png
    

    gprof2dot 输出控制命令可以参考 https://github.com/jrfonseca/gprof2dot#documentation

    输出节点解释

    +------------------------------+
    |        function name         |
    | total time % ( self time % ) |
    |         total calls          |
    +------------------------------+
    
    • total time % is the percentage of the running time spent in this function and all its children;
    • self time % is the percentage of the running time spent in this function alone;
    • total calls is the total number of times this function was called (including recursive calls).

    节点连接线解释

               total time %
                  calls
    parent --------------------> children
    
    • total time % is the percentage of the running time transfered from the children to this parent (if available);
    • calls is the number of calls the parent function called the children.
  • 相关阅读:
    linux基础(一)
    网络基础之网络协议篇
    操作系统简介
    计算机组成原理
    【C#】=>符号的使用
    【Unity3D】用继承EditorUpdater类来实现Editor模式下的后台处理
    【Unity3D】Tags和Layers
    【Unity3D】Unity3D中Material与ShareMaterial引用的区别
    【Unity3D】Unity中用C#读取CSV文件
    【Unity3D】用C#读取INI配置文件
  • 原文地址:https://www.cnblogs.com/jiahu-Blog/p/13399923.html
Copyright © 2020-2023  润新知