在Ubuntu下对C++程序进行性能测试,可通过编译优化、系统工具分析及可视化工具结合的方式,定位性能瓶颈并优化代码。以下是具体方法:
性能测试前,需编译程序并保留调试信息,以便工具准确关联性能数据与源代码。
-g添加调试信息,-pg(仅gprof需要)生成性能分析数据,-O2/-O3开启优化(避免优化影响分析准确性)。g++ -std=c++11 -g -O2 -o my_program my_program.cppPerf是Linux内核集成的系统级性能分析工具,支持CPU使用率、函数调用堆栈、缓存命中率等分析,适合快速定位热点函数。
sudo apt install linux-tools-common linux-tools-$(uname -r)sudo perf record -g -- ./my_program(-g记录调用堆栈,--分隔命令选项)sudo perf report(交互式界面显示函数耗时占比,按Enter展开详情)git clone https://github.com/brendangregg/FlameGraph.git;perf record -F 99 -ag -- sleep 10 ./my_program && ./FlameGraph/stackcollapse-perf.pl perf.data | ./FlameGraph/flamegraph.pl > perf.svg(-F 99设置采样频率为99Hz,sleep 10采样10秒,perf.svg为可视化结果)。Gprof提供函数级别的调用次数、耗时及调用关系图,适合简单程序的函数级性能分析。
g++ -pg -o my_program my_program.cpp(-pg生成gmon.out数据文件)./my_program(运行后自动生成gmon.out)gprof my_program gmon.out > analysis.txt(analysis.txt包含函数耗时占比、调用关系)。Callgrind是Valgrind套件中的工具,通过模拟执行分析函数调用成本(CPU时间、内存访问),适合深度优化。
sudo apt install valgrindvalgrind --tool=callgrind ./my_program(生成callgrind.out.<PID>文件)kcachegrind callgrind.out.<PID>(图形化显示函数调用树、耗时占比,支持排序和过滤)。OProfile利用CPU性能计数器分析进程/函数性能,支持硬件事件(如分支预测失败、缓存未命中)。
sudo apt install oprofilesudo opcontrol --start(默认采集所有CPU事件)sudo opcontrol --stop;sudo opreport -f func(显示函数级耗时占比)。Top命令实时显示进程/线程的CPU、内存占用,适合快速排查高资源消耗进程。
top(默认显示所有进程的CPU、内存占用)top -p <PID>(<PID>为目标进程ID,显示该进程的详细资源占用)top -p <PID> -H(-H显示进程内的线程级资源占用,帮助定位多线程瓶颈)。