1. 使用perf工具(Linux内核自带,推荐)
perf是Linux内核提供的强大性能分析工具,支持函数级、指令级热点分析及硬件性能计数器(如缓存命中率、分支预测)统计。
sudo apt-get update
sudo apt-get install linux-tools-common linux-tools-$(uname -r) linux-perf-$(uname -r)
-g选项(保留调试信息,便于perf关联源代码):g++ -std=c++11 -g -o my_program my_program.cpp
perf record捕获程序运行时的调用栈信息(-g选项生成调用图):sudo perf record -g -- ./my_program
perf report交互式查看热点函数(按Enter键展开调用栈,按q退出):sudo perf report
git clone https://github.com/brendangregg/FlameGraph.git
cd FlameGraph
perf script > perf.out # 将perf数据转换为文本格式
perl stackcollapse-perf.pl perf.out | perl flamegraph.pl > perf-flamegraph.svg
用浏览器打开perf-flamegraph.svg,即可看到函数调用关系及耗时占比(宽度越大,耗时越长)。2. 使用gprof工具(GNU Profiler,传统工具)
gprof是GNU编译器套件的一部分,适用于函数级别的时间消耗分析(需重新编译程序)。
-pg选项(生成性能分析数据):g++ -pg -o my_program my_program.cpp
gmon.out文件(包含调用次数、时间等信息):./my_program
gprof解析gmon.out,输出函数调用关系及时间占比:gprof my_program gmon.out > analysis.txt
打开analysis.txt,可查看“Flat profile”(函数耗时占比)和“Call graph”(调用关系)。3. 使用Valgrind Callgrind工具(内存与CPU综合分析)
Valgrind通过虚拟机模拟程序执行,提供详细的CPU调用轨迹及内存访问分析(适合内存敏感型程序)。
sudo apt-get install valgrind
callgrind工具运行程序(生成callgrind.out.<PID>文件):valgrind --tool=callgrind ./my_program
callgrind.out文件,查看函数调用树、耗时占比及内存访问情况:kcachegrind callgrind.out.*
在KCacheGrind界面中,可通过“Call Graph”标签查看调用关系,“Cost Center”标签查看耗时详情。4. 实时监控工具(top/htop)
top/htop是Linux系统自带的实时监控工具,适合快速查看进程的CPU、内存占用情况(无法深入函数级别)。
top,可看到CPU使用率、内存占用、进程PID等信息(按q退出)。top -p <PID> -H(<PID>为目标进程ID,-H显示线程级信息),可监控特定进程的实时资源占用。注意事项
-g选项(perf、Callgrind等工具需要调试信息才能准确定位源代码位置);perf record -g --threads=all(记录所有线程的调用栈);git、perl等工具(Ubuntu默认安装)。