• 性能调试工具


    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的使用

  • 相关阅读:
    ASP.NET 上传文件最大值调整
    Git撤销提交
    MVC模式下如何实现RegisterStartupScript等功能
    RESTful接口设计原则/最佳实践(学习笔记)
    如何编译MongoDB?
    【NTKO】一些常用操作
    【solr】使用-取反时注意,-是表示排除,不能单独做条件用
    【layui】日期范围分开两个input,开始日期选中时,结束日期的最小可选择就是开始日期
    【转】【Java】剪切板操作大全
    【转】彻底禁用Chrome的“请停用以开发者模式运行的扩展程序”提示
  • 原文地址:https://www.cnblogs.com/gwzz/p/14699617.html
Copyright © 2020-2023  润新知