安装

1
2
3
4
5
6
7
8
9
10
11
12
13
# 克隆代码
git clone https://github.com/gperftools/gperftools.git
# 安装依赖库
sudo apt-get install libunwind8-dev
# 程序编译
cd gperftools
./autogen.sh
./configure
make -j 8
# 安装到系统文件夹
sudo make install
# 刷新动态库文件
ldconfig

使用

非侵入式

顾名思义,不需要在程序中加入任何代码,直接运行即可。
需要在CmakeList中加入相关的编译选项 -Wl,--no-as-needed,-lprofiler,--as-needed

1
target_link_libraries(ncnn_test ncnn -Wl,--no-as-needed,-lprofiler,--as-needed)

然后在命令行中使用CPUPROFILE进行执行前的配置,同时执行需要分析的程序。

1
CPUPROFILE=./ncnn_test.prof ./ncnn_test

之后,即可生成当前程序的性能分析文件。

侵入式

需要在程序中加入相关的代码,然后运行程序。这种方式需要在每个需要分析的函数中加入相关的代码。但是CmakeList中仅需要加入-lprofiler即可。

1
target_link_libraries(ncnn_test ncnn -lprofiler)

代码中的相关代码如下:

1
2
3
4
5
6
7
8
#include <gperftools/profiler.h>

int main() {
ProfilerStart("./ncnn_test.prof");
// ...
ProfilerStop();
return 0;
}

之后,执行程序即可得到性能分析文件。

性能分析

需要使用pprof进行文件信息解析

1
2
3
4
5
6
7
8
9
> pprof --text  ./ncnn_test ncnn_test.prof
Using local file ./ncnn_test.
Using local file test.prof.
addr2line: DWARF error: section .debug_info is larger than its filesize! (0x93f189 vs 0x530f70)
Total: 8 samples
8 100.0% 100.0% 8 100.0% omp_get_num_procs
0 0.0% 100.0% 8 100.0% clone
0 0.0% 100.0% 8 100.0% omp_in_final
0 0.0% 100.0% 8 100.0% start_thread

其输出形式有--text控制,还可以使用其他形式进行展示,如--pdf生成pdf文件,--web生成网页。

注意事项

当你的程序很短,或者运行速度很快时,使用--text形式进行性能分析时,可能无法得到有效的性能分析信息。
只会得到如下信息

1
2
Using local file ./ncnn_test.
Using local file test.prof.

此时,可以通过设置CPUPROFILE_FREQUENCY为更大的数值,来增加性能分析的频率。从而避免出现上述情况。
采样频率越高,性能分析的准确度越高。

1
export CPUPROFILE_FREQUENCY=9999999

或者

1
2
# RECOMMEND
CPUPROFILE_FREQUENCY=9999999 ./ncnn_test