性能分析
创建:2023-10-27 17:43
更新:2025-04-24 22:50

# perf

sudo apt install linux-perf
sudo perf record -F 99 -a -g -p `pidof ./app` -o perf.data -- sleep 30
git clone https://github.com/brendangregg/FlameGraph.git $HOME/FlameGraph
sudo perf script -i perf.data | $HOME/FlameGraph/stackcollapse-perf.pl | $HOME/FlameGraph/flamegraph.pl > perf.svg

获取到的svg可以在浏览器打开,火焰图展示的是调用栈占据cpu时间列表。顶部就是正在执行的函数,宽度表示函数占据的cpu时间

# gprof

gprof 是一个 GNU 工具,用于分析程序的性能。它通过在程序运行时收集函数调用信息和每个函数的执行时间,生成一个调用图和每个函数的时间统计信息,帮助开发者找出程序中的性能瓶颈。

g++ -pg your_program.cpp -o your_program
./your_program
gprof your_program gmon.out
Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls  Ts/call  Ts/call  name
 90.00      0.90     0.90        1     0.90     0.90  longRunningFunction
 10.00      1.00     0.10        1     0.10     0.10  shortRunningFunction

# valgrind

valgrind 是一个强大的内存调试和性能分析工具集,它可以检测内存泄漏、越界访问、未初始化内存使用等内存相关问题,还可以进行 CPU 性能分析。valgrind 通过在程序运行时对其进行插桩,监控程序的内存操作和 CPU 指令执行情况。

内存检查(Memcheck)

valgrind --leak-check=full --show-leak-kinds=all ./your_program
==1234== HEAP SUMMARY:
==1234==     in use at exit: 1024 bytes in 1 blocks
==1234==   total heap usage: 1 allocs, 0 frees, 1024 bytes allocated
==1234== 
==1234== 1024 bytes in 1 blocks are definitely lost in loss record 1 of 1
==1234==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1234==    by 0x108659: main (your_program.cpp:10)

CPU 性能分析(Callgrind)

valgrind --tool=callgrind ./your_program
kcachegrind callgrind.out.<pid>

kcachegrind 会以图形化的方式展示函数调用图和每个函数的性能统计信息,帮助你找出性能瓶颈。