通過調整GCC的編譯優化級別,對比不同選項對生成代碼性能的影響,是評估GCC性能的基礎方法。常用優化選項包括:
-O0(無優化,便于調試)、-O1(輕度優化,平衡編譯時間與性能)、-O2(中度優化,提升執行速度)、-O3(重度優化,啟用循環展開、向量化等激進優化);-flto(鏈接時優化,跨文件優化代碼)、-fopenmp(啟用多線程并行編譯,提升多核利用率)。gcc -O2 -o test test.c vs gcc -O3 -o test test.c),通過time命令測量執行時間,對比性能差異。借助專業工具定位程序性能瓶頸,評估GCC生成的代碼質量:
-pg選項(gcc -pg -o my_program my_program.c),運行程序生成gmon.out文件,用gprof my_program gmon.out > analysis.txt分析結果。perf stat ./example統計基本指標)、事件記錄(perf record -g ./example記錄函數調用棧)、報告生成(perf report可視化分析)。需安裝linux-tools-common和linux-tools-generic包。callgrind模塊可分析函數調用耗時,massif模塊可分析內存使用情況。步驟:valgrind --tool=callgrind ./my_program記錄數據,用kcachegrind可視化調用關系。使用標準化基準測試工具,對比不同GCC版本或優化選項的綜合性能:
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/byte-unixbench/UnixBench5.1.3.tgz && tar -xf UnixBench5.1.3.tgz && cd UnixBench && make),運行./Run -c 1(單核)或./Run -c 2(雙核)。wget https://github.com/Fibonacci43/SuperPI/archive/refs/heads/main.zip && unzip main.zip && cd SuperPI-main && gcc -O3 -funroll-loops -fomit-frame-pointer pi_fftcs.c -lm -o pi_css5),運行./pi_css5 1048576(計算20位小數)。wget -qO- bench.sh | bash或chmod +x superbench.sh && ./superbench.sh。通過編寫簡單的測試程序,手動測量不同優化選項的執行時間,直觀對比性能:
clock()函數記錄執行時間(#include <time.h>,start = clock();執行代碼;end = clock();計算cpu_time_used = ((double)(end - start))/CLOCKS_PER_SEC;)。gcc -O0 -o test test.c、gcc -O3 -o test test.c),運行程序并記錄時間,對比不同優化級別的性能差異。通過運行時收集的性能數據指導編譯器優化,提升生成代碼的質量:
gcc -fprofile-generate -o my_program my_program.c(生成帶插樁的可執行文件);./my_program(生成性能數據文件default.profraw);llvm-profdata merge -output=default.profdata default.profraw(將原始數據轉換為LLVM可識別的格式);gcc -fprofile-use -O2 -o my_program_optimized my_program.c(使用性能數據指導優化)。