C++在Ubuntu上如何进行性能分析
导读:1. 使用perf工具(Linux内核自带,推荐) perf是Linux内核提供的强大性能分析工具,支持函数级、指令级热点分析及硬件性能计数器(如缓存命中率、分支预测)统计。 安装perf:在Ubuntu终端执行以下命令安装依赖包:sud...
1. 使用perf工具(Linux内核自带,推荐)
perf是Linux内核提供的强大性能分析工具,支持函数级、指令级热点分析及硬件性能计数器(如缓存命中率、分支预测)统计。
- 安装perf:在Ubuntu终端执行以下命令安装依赖包:
sudo apt-get update sudo apt-get install linux-tools-common linux-tools-$(uname -r) linux-perf-$(uname -r) - 编译C++程序:使用g++编译时添加
-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 - 生成火焰图(可视化):通过FlameGraph工具将perf数据转换为直观的SVG火焰图(需提前克隆FlameGraph仓库):
用浏览器打开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.svgperf-flamegraph.svg,即可看到函数调用关系及耗时占比(宽度越大,耗时越长)。
2. 使用gprof工具(GNU Profiler,传统工具)
gprof是GNU编译器套件的一部分,适用于函数级别的时间消耗分析(需重新编译程序)。
- 编译C++程序:添加
-pg选项(生成性能分析数据):g++ -pg -o my_program my_program.cpp - 运行程序:执行程序会自动生成
gmon.out文件(包含调用次数、时间等信息):./my_program - 生成分析报告:使用
gprof解析gmon.out,输出函数调用关系及时间占比:
打开gprof my_program gmon.out > analysis.txtanalysis.txt,可查看“Flat profile”(函数耗时占比)和“Call graph”(调用关系)。
3. 使用Valgrind Callgrind工具(内存与CPU综合分析)
Valgrind通过虚拟机模拟程序执行,提供详细的CPU调用轨迹及内存访问分析(适合内存敏感型程序)。
- 安装Valgrind:通过apt安装Valgrind:
sudo apt-get install valgrind - 记录调用数据:使用
callgrind工具运行程序(生成callgrind.out.< PID>文件):valgrind --tool=callgrind ./my_program - 可视化分析:使用KCacheGrind工具(Ubuntu默认安装)打开
callgrind.out文件,查看函数调用树、耗时占比及内存访问情况:
在KCacheGrind界面中,可通过“Call Graph”标签查看调用关系,“Cost Center”标签查看耗时详情。kcachegrind callgrind.out.*
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默认安装)。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: C++在Ubuntu上如何进行性能分析
本文地址: https://pptw.com/jishu/743167.html
