性能分析器

上一篇文章讲述了内存、CPU实时监视器的使用,而本文则着重于更高层的性能分析器(profiler)。

性能分析器

所谓性能分析器,就是分析程序运行中究竟什么函数运行次数最多,什么地方存在瓶颈(bottleneck)。 而实时监视器也可以算是一种性能分析器,都是用来进行性能分析(profiling),只是返回的内容不同。

Linux环境下GNU内置了一个性能分析器,称为gprof。 有一个非常强的动态分析工具称为valgrind,在我校的vmatrix系统上也被用到,详情见静态程序分析 补充(1)–Valgrind

gprof

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

valgrind

机器指令的性能分析采用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'

pprof

谷歌家的性能分析器

time

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

参考资料