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参考
Linux 性能分析valgrind(二)之callgrind使用