1. 记录数据

perf record -e cpu-clock -g --call-graph  dwarf  $NEMU_HOME/build/riscv32-nemu-interpreter  -b ./build//microbench-riscv32-nemu.bin 
  • -e指定要监控的性能时间, cpu-clock表示监控CPU占用时间。
  • -g启用调用堆栈。
  • --call-graph dwarf指定调用图的生成方式。
  • $NEMU_HOME/build/riscv32-nemu-interpreter -b ./build//microbench-riscv32-nemu.bin 为要分析的程序及其参数。

执行完上述命令后,当前文件夹下会生成perf.data文件。

2. 查看数据

perf report

image-20241224161708328

从上图的"self"列中可以看出中可以看出,decode_exec.isa.0占用了较多的时间,.isra:这是编译器优化过程中的一个标识,具体来说,指的是 Interprocedural Scalar Replacement of Aggregates(跨过程标量替换聚合体)

使用如下命令查看具体代码占用的时间:

perf annotate decode_exec.isra.0

image-20241224162853901

从上面还是可以能看出,主要是访存相关的指令占用时间较长。

3. 生成可视化火焰图

生成可视化的火焰图需要安装flamegraph.

perf script -i perf.data > perf.unfold
stackcollapse-perf.pl perf.unfold > perf.folded
flamegraph.pl perf.folded > perf.svg

perf

通过火焰图可以看出程序运行时函数的占用时间,可针对进行优化。

4. 封装为简易脚本

#!/usr/bin/bash

perf record -e cpu-clock -g --call-graph dwarf "$@" && \
echo "Generate Flame Graph..." && \
perf script -i perf.data | stackcollapse-perf.pl | flamegraph.pl > perf.svg && \
xdg-open perf.svg