在 Linux 下做 C++ 性能分析(Profiling),通常分为 CPU 分析、内存分析、系统调用/IO 分析、并发/锁分析 等。下面从 实用角度系统介绍,从“最常用”到“进阶”。
优点
# 安装
sudo apt install linux-tools-common linux-tools-generic
# 采样分析
perf record -g ./your_program
# 查看报告
perf report
perf record -F 99 -g ./your_program
-F 99:每秒采样 99 次(避免采样与周期对齐)-g:记录调用栈perf script | stackcollapse-perf.pl > out.perf-folded
flamegraph.pl out.perf-folded > flamegraph.svg
火焰图能非常直观看到 哪个函数最耗时
g++ -pg -o app app.cpp
./app
gprof app gmon.out
❌ 缺点:
适合 内存分配、泄漏、cache 行为
valgrind --tool=callgrind ./your_program
kcachegrind callgrind.out.*
✅ 优点:
❌ 缺点:
sudo apt install heaptrack
heaptrack ./your_program
heaptrack_gui heaptrack.*.gz
✅ 优点:
g++ -fsanitize=address -g app.cpp
./a.out
✅ 用于:
perf stat ./your_program
输出:
strace -c ./your_program
适合分析:
perf lock record ./program
perf lock report
g++ -fsanitize=thread -g app.cpp
✅ 检测:
-O2 -g -DNDEBUG
调试性能问题:
-O2 -g
避免:
-O0 做性能分析(无意义)
objdump -d a.out | less
或:
perf annotate
适合:
| 现象 | 可能原因 | 工具 |
|---|---|---|
| CPU 高但慢 | 热点函数 | perf |
| 内存暴涨 | 分配过多 | heaptrack |
| 程序卡住 | 锁竞争 | perf lock / TSan |
| IO 慢 | 系统调用 | strace |
| 偶发慢 | cache miss | perf stat |
Linux C++ 性能分析首选 perf + 火焰图,内存用 heaptrack,正确性用 Sanitizer。
如果你愿意,可以告诉我:
我可以直接帮你 解读火焰图或 perf report。