在Ubuntu系统里给C++程序做性能分析,其实流程并不复杂,关键是用对工具、走对步骤。下面就把常用的几种方法拆开来讲,每条都附上实际命令,方便你直接上手。
-
编译程序:用
g++编译时,记得加上几个关键标志。调试信息用-g,优化等级用-O2(当然也可以根据需求调整),这样既能保证分析时有符号信息,又能让代码跑得更快。举个栗子:g++ -g -O2 -o myprogram myprogram.cpp -
选对分析工具:Ubuntu下有几种主流的性能分析工具,各有所长,可以根据场景选择。
-
gprof:经典老牌工具,基于采样。编译时加上
-pg标志:g++ -g -pg -o myprogram myprogram.cpp运行程序后会自动生成
gmon.out文件,然后用gprof解析:gprof myprogram gmon.out > analysis.txt -
perf:Linux内核自带的性能分析利器,功能很强大。先安装(如果没装的话):
sudo apt-get install linux-tools-common linux-tools-generic linux-tools-$(uname -r)用
perf record记录程序运行:sudo perf record -g ./myprogram生成
perf.data后,用perf report查看报告,推荐加-g graph,0.5,caller参数,能展示调用链:sudo perf report -g graph,0.5,caller -
Valgrind:内存检查和性能分析两不误。其中的
callgrind专门做性能分析。安装:sudo apt-get install valgrind运行:
valgrind --tool=callgrind ./myprogram生成
callgrind.out.pid文件,可以用KCacheGrind或QCachegrind可视化查看。 -
FlameGraph:火焰图是可视化性能瓶颈的绝佳方式。先克隆项目:
git clone https://github.com/brendangregg/FlameGraph.git然后用
perf采集数据并转换为火焰图格式:sudo perf record -F 99 -ag -- sleep 60sudo perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > myprogram.svg生成的
myprogram.svg用浏览器打开就能看到直观的火焰图。
-
-
分析报告:无论用哪种工具,最终都会给出函数调用次数、执行时间、热点函数等信息。重点关注那些调用次数多、耗时长的函数,它们就是需要优化的地方。
掌握这些步骤,你就能在Ubuntu下系统地对C++程序进行性能分析,快速定位瓶颈,优化效率。动手试试吧,实践出真知。