上一篇文章讲述了内存、CPU实时监视器的使用,而本文则着重于更高层的性能分析器(profiler)。
所谓性能分析器,就是分析程序运行中究竟什么函数运行次数最多,什么地方存在瓶颈(bottleneck)。 而实时监视器也可以算是一种性能分析器,都是用来进行性能分析(profiling),只是返回的内容不同。
Linux环境下GNU内置了一个性能分析器,称为gprof。 有一个非常强的动态分析工具称为valgrind,在我校的vmatrix系统上也被用到,详情见静态程序分析 补充(1)–Valgrind。
gprof的使用和gdb一样简明易懂。
-pg
gmon.out
文件gprof <exe> gmon.out > analysis.txt
将性能分析结果写出
<exe>
执行文件带指令,只需在第一次运行时添加即可,第二次运行gprof
只用告诉其文件名最终可以得到如下结果,详细说明每个函数的使用情况
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
33.86 15.52 15.52 1 15.52 15.52 func2
33.82 31.02 15.50 1 15.50 15.50 new_func1
33.29 46.27 15.26 1 15.26 30.75 func1
0.07 46.30 0.03 main
机器指令的性能分析采用callgrind和cachegrind,但对于计时分析并不那么擅长
内存泄露分析,编译时需要添加-g
指令
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./a.out
另:查看Linux下内存占用最多的进程,可以通过top -o %MEM
实现。
清除缓存用
sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
谷歌家的性能分析器
Linux系统内置的计时工具
time [OPTIONS] COMMAND [ARGS]
同时也可以用来查看峰值内存
,-v
中的maximum resident set size
-o
-v
/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'
注意real/wall time才是程序真正运行时间,不是user