性能调试工具

C++性能调试工具

Window

Ubuntu

使用valgrind进行命令行性能(所谓的性能就是指执行次数)检测,使用kcachegrind进行可视化检测;

1 前置条件

1.1 设置Vim环境

  • 如何设置Vim的tab为4个空格:

vimrc路径:/etc/vim/vimrc。在最后一行添加:set ts=4即可完成tab变成4个空格

  • 如何回车缩进变成4个空格:set smartindent

  • 设置Vimrc

    root权限进入/etc/vim 路径下面打开vimrc 在后面加入
    set nu                    //显示行号
    set autoindent        //自动缩进
    set ts=4                //设置tab的值为四个空格
    set expandtab # 缩进用空格表示或用tab表示noexpandtab
    set list                   //显示隐藏字符
    set sm                   //自动匹配} ] ) ,编程时用
    set sw=6              //shift+>> 右移一次6个字符
    
    source /etc/vim/vimrc刷新
    
  • 额外

    重新打开一个文本文件,就会发现tab键的缩进变成4个空格

    附加要点: :f:显示当前文件名 :E:可以在底部显示当前文件所在目录下的所有文件名,还可以递归查看

  • 剪切

    快捷键方式:
    dd:剪切光标所处当前行
    n + dd:剪切光标所在行及以下共 n 行
    按 p 粘贴在光标所在行
    
  • 复制

    快捷键方式:
    yy:复制光标所处当前行
    n + yy:复制光标所在行及以下共 n 行
    按 p 粘贴在光标所在行
    
  • 删除

    快捷键方式:
    dd:删除光标所处当前行
    n + dd:删除光标所在行及以下共 n 行
    
  • 退出

    :w 保存但不退出
    :wq 保存并退出
    :q 退出
    :q! 强制退出,不保存
    :e! 放弃所有修改,从上次保存文件开始再编辑命令历史
    
  • 显示特殊字符

    :set list: 让vim显示空格、tab字符。tab键为^I,每行的结尾为$。
    

1.2 更新Ubuntu环境

  • 更新数据源: sudo apt udpate
  • 安装g++: sudo apt install g++
  • 查看g++版本:g++ -v

2编写代码和检测

2.1 变成C++代码

    int accumulate(int begin, int end)
    {   
        int result = 0;
        for (int i = begin; i < end; i++) 
        {
            result += i;

        }

    }

    int accumulate0_10000()
    {
        return accumulate(0, 100000);
    }

    int acccumulate_0_20000()
    {
        return accumulate(0, 200000);
    }

    int main()
    {
        accumulate0_10000();
        accumulate0_20000();
    } 


    # 编译C++源码
    -g:添加gdb调试选项;
    -o0:关闭优化功能

    -c:只编译不链接,只生成目标文件;
    g++ -g ./foo.cpp -o0 foo

2.2 使用valgrind检测

    valgrind --tool=callgrind --dump-instr=yes ./foo

输出结果:

    ==9126== Callgrind, a call-graph generating cache profiler
    ==9126== Copyright (C) 2002-2017, and GNU GPL'd, by Josef Weidendorfer et al.
    ==9126== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
    ==9126== Command: ./foo
    ==9126== 
    ==9126== For interactive control, run 'callgrind_control -h'.
    ==9126== 
    ==9126== Events    : Ir
    ==9126== Collected : 2229625
    ==9126== 
    ==9126== I   refs:      2,229,625

直接2229625次

2.3 使用kcachegrind可视化

sudo apt install kcachegrind

kcachegrind kcachegrind callgrind.out.10798 # callgrind.out.10798是valgrind在本地生成出的dump文件

安装之后,在当前目录下直接运行kcachegrind就会出现可视化效果

参考:https://blog.csdn.net/imred/article/details/100187923

2.4 生成流程图

把callgrind生成的性能数据转换成dot格式数据,使用dot把分析数据图形化; 配合使用gprof2dot.py与dot工具,就可以知道函数的调用关系;

  • 准备:

    - 下载gprof2dot.tar.gz

  • 附加:

    - 查找Python在哪里:whereis python

3 适应平台

It works best on x86 and amd64, and unfortunately currently does not work so well on PowerPC, ARM, Thumb or MIPS code.

3.1性能分析valgrind之callgrind使用

  • 命令格式:使用valgrind工具生成性能分析数据,命令格式如下

    valgrind  --tool=callgrind ./test
    
    说明:./test就是要分析的程序。
    
    执行完毕后,就会在当前目录下生成一个文件。
    
    如果你调试的程序是多线程,你也可以在命令行中加一个参数:
    -separate-threads=yes
    这样就会为每个线程单独生成一个性能分析文件。如下:
    valgrind --tool=callgrind --separate-threads=yes ./test
    
  • 性能分析命令

    valgrind --tool=callgrind ./test_main --dump-instr=yes --trace-jump=yes
    说明:
    --tool=callgrind #使用callgrind工具
    --dump-instr=yes # 可产生指令级的信息,该信息可以用kcachegrind可视化
    --trace-jump=yes  # 或许应该写成:--collect jump=yes 用于分析更加详细的jump信息
    
  • 场景

    • 多线程性能分析

3附加

grind:英 /ɡraɪnd/ 美 /ɡraɪnd/ : 磨碎;磨快 granularity:英 /ˌɡrænjəˈlærəti/ 美 /ˈɡrænjʊˈlerəti/ :n. 间隔尺寸,[岩] 粒度 instruction granularity:指令的粒度 profile data:剖面数据 profiler:英 /ˈprəʊfaɪlə(r)/ 美 /ˈproʊfaɪlər/ :. 分析器,分析工具;仿形铣床;[测] 断面仪 heuristics :英 /hjuˈrɪstɪks/ 美 /hjuˈrɪstɪks/ :n. 启发法;启发式教学法

4参考

valgrind官方资料

Linux 性能分析valgrind(二)之callgrind使用

Valgrind工具集详解(十五):Callgrind(性能分析图)

Linux C/C++调试之三:性能分析工具callgrind的使用

原文地址:https://www.cnblogs.com/gwzz/p/14699617.html