通过调整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(使用性能数据指导优化)。