最近在做ORB-SLAM的性能分析,用到了Valgrind和gperftools工具做分析,在这里做一个简单的记录,谁知道下次什么时候再次使用呢。
测试环境:ubuntu18.04
1. Valgrind安装和简单介绍
进入官网下载,然后解压。依次使用下列命令:
cd valgrind-3.17.0/
./autogen.sh
./configure --prefix=/home/renz/rz/opt/valgrind
make
sudo make install
因为我主要用它做性能的一个分析,所以没有深入了解。下面简单介绍一下Valgrind,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif。
- Memcheck 工具主要内存方面的程序错误
- Callgrind收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache模拟。
- Cachegrind模拟 CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中 cache的丢失和命中。
- Helgrind主要用来检查多线程程序中出现的竞争问题。
- Massif堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。
2. 安装gperftools
从https://github.com/gperftools/gperftools/releases下载最新版本的gperftools源码包。解压后依次执行下列命令:
./autogen.sh
./configure
make -j6
sudo make install
3. ORB-SLAM的性能分析图
本人使用的是ORB-SLAM2和EuRoC数据集进行测试,首先运行ORB-SLAM程序,官网也有介绍,也可以点击链接进行安装。
- 首先运行orb-slam程序:
./EuRoC_v1_03_difficult.sh
pprof --callgrind ./EuRoC_v1_03_difficult.sh ./cpu1_perf.prof > EuRoC_v1_03_difficult.callgrind
kcachegrind EuRoC_v1_03_difficult.callgrind
上面的cpu1_perf名字是自己随意取的。
- 然后执行下列命令,生成关系图:
pprof --callgrind ./EuRoC_v1_03_difficult.sh ./cpu1_perf.prof > EuRoC_v1_03_difficult.callgrind
- 最后使用下列命令进行查看。
以后也可以直接运行这个命令直接查看,因为已经生成了相应的.callgrind文件。
kcachegrind EuRoC_v1_03_difficult.callgrind
运行过程中可能遇到类似于下列的错误:
报错:确定.callgrind文件可读权限
...
substr outside of string at /usr/local/bin/pprof
在终端执行下列命令即可:
export PPROF_PATH=/usr/local/bin/pprof
最后生成的性能关系图如下所示:
还可以查看其他函数的关系图: