在Ubuntu下對C++程序進行性能測試,可通過編譯優化、系統工具分析及可視化工具結合的方式,定位性能瓶頸并優化代碼。以下是具體方法:
性能測試前,需編譯程序并保留調試信息,以便工具準確關聯性能數據與源代碼。
-g
添加調試信息,-pg
(僅gprof需要)生成性能分析數據,-O2
/-O3
開啟優化(避免優化影響分析準確性)。g++ -std=c++11 -g -O2 -o my_program my_program.cpp
Perf是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 valgrind
valgrind --tool=callgrind ./my_program
(生成callgrind.out.<PID>
文件)kcachegrind callgrind.out.<PID>
(圖形化顯示函數調用樹、耗時占比,支持排序和過濾)。OProfile利用CPU性能計數器分析進程/函數性能,支持硬件事件(如分支預測失敗、緩存未命中)。
sudo apt install oprofile
sudo opcontrol --start
(默認采集所有CPU事件)sudo opcontrol --stop
;sudo opreport -f func
(顯示函數級耗時占比)。Top命令實時顯示進程/線程的CPU、內存占用,適合快速排查高資源消耗進程。
top
(默認顯示所有進程的CPU、內存占用)top -p <PID>
(<PID>
為目標進程ID,顯示該進程的詳細資源占用)top -p <PID> -H
(-H
顯示進程內的線程級資源占用,幫助定位多線程瓶頸)。