mac系统下GCC优化编译的使用
编译流程
预处理:g++ -E homework.cpp -o homework.i
编译:g++ -S homework.i -o homework.s //.s为汇编文件
汇编:g++ -c homework.s -o homework.o
链接:g++ homework.o -o homework
优化选项
-O0(无优化):
这是默认的优化级别,编译器不执行任何优化。
适用于调试目的或要求最小编译时间的情况。
在这种情况下,编译器会尽量缩短编译消耗(时间、空间),以便产出与程序预期结果相符的调试信息。
-O1(基本优化):
执行一些基本的优化,如删除未使用的变量、内联简单函数等。
旨在提高代码的执行效率,同时保持较快的编译速度。
相比-O0,它会对代码的分支、常量以及表达式等进行优化,但并不会执行会花费大量时间的优化操作。
-O2(中级优化):
在-O1的基础上进行更多的优化,包括更大范围的内联、循环展开、函数调用图优化等。
它可以显著提高代码的性能,但编译时间可能会稍长。
-O2是推荐的优化等级,除非有特殊的需求。
-O3(高级优化):
在-O2的基础上进行更多的优化,例如使用伪寄存器网络、普通函数的内联,以及针对循环的更多优化。
它是优化级别最高的选项,旨在进一步提高代码性能,但编译时间可能会更长。
如g++ -O2 homework.cpp -o homework,生成优化后的可执行代码
再通过time命令查询运行时间
time ./homework
编译过程优化信息输出
通过-fopt-info选项可以看出在原有代码的基础上进行了哪些优化
macOS系统中默认的C/C++编译器是clang/clang++,命令行使用gcc/g++或者clang/clang++来执行命令时,都是调用clang/clang++编译器,缺少-fopt-info选项。
因此,可以通过brew安装gcc,在运行命令时要使用gcc-13
gcc-13 -O2 -S homework.cpp -fopt-info
homework.cpp:37:9: optimized: Inlining int vecadd(double*, double*, double*, size_t)/547 into int main(int, char**)/549.
homework.cpp:77:1: optimized: Inlined void __static_initialization_and_destruction_0()/1093 into (static initializers for homework.cpp)/1224 which now has time 26.000000 and size 9, net change of -4.
homework.cpp:13:23: optimized: loop vectorized using 16 byte vectors
可以很清楚的看到进行了哪些优化
在这个基础上,可以使用vimdiff来比较优化前和优化后的汇编语言的不同之处。