Sun Studio 12:C 用户指南

B.2.117 -xO[1|2| 3|4|5]

优化目标代码;注意大写字母 O 后跟数字 12345。一般说来,优化级别越高,运行时性能越好。不过,较高的优化级别会延长编译时间并生成较大的可执行文件。

在少数情况下, – xO2 级别的执行可能比其他优化级别好,而 – xO3 也可能胜过 – xO4。尝试用每个级别进行编译,以查看您是否会遇到这种少见的情况。

如果优化器内存不足,它将尝试通过在较低的优化级别中重试当前的过程来进行恢复,并以命令行选项中指定的原始级别继续后续过程。

缺省为不优化。不过,只有不指定优化级别时才可能使用缺省设置。如果指定了优化级别,则没有任何选项可用来关闭优化。

如果尝试不设置优化级别,请不要指定任何隐含优化级别的选项。例如,-fast 是将优化级别设置为 -xO5 的宏选项。隐含优化级别的所有其他选项都会给出优化已设置的警告消息。不使用任何优化来编译的方法是从命令行删除所有选项或创建指定优化级别的文件。

如果使用 - g 并且优化级别为 - xO3 或更低,编译器将提供几乎进行全面优化的最佳效果符号信息。尾部调用优化和后端内联被禁用。

如果使用 - g 并且优化级别为 - xO4 或更高,编译器将提供进行全面优化的最佳效果符号信息。

使用 -g 进行调试不会抑制 -xOn,但 -xOn 会用某些方法限制 -g。例如,优化选项会降低调试的效用,以致无法显示 dbx 中的变量,但仍可使用 dbx where 命令获取符号回溯。有关更多信息,请参见《使用 dbx 调试程序》第 1 章中的“调试优化的代码”。

如果同时指定了 -xO-xmaxopt,那么用 -xO 设置的优化级别不得超过 -xmaxopt 值。

如果在 -xO3-xO4 级别上优化非常大的程序(在同一程序中有数千行代码),优化器可能需要大量虚拟内存。在这种情况下,机器性能可能会降低。

B.2.117.1 SPARC 优化的说明

下表描述了它们在 SPARC 平台上如何操作。

表 B–31 SPARC 平台上的 -xO 标志

值 

含义 

-xO1

执行基本局部优化(窥孔优化)。 

-xO2

执行基本局部和全局优化。其中包括感应变量排除、局部和全局常用子表达式排除、代数简化、 副本传播、常量传播、循环不可变优化、寄存器分配、基本块合并、尾部循环排除、死代码排除、尾部调用排除和复杂表达式扩展。 

-xO2 级别不会将全局、外部或间接引用或定义分配给寄存器。它将这些引用和定义视为被声明为 volatile。一般说来,-xO2 级别产生的代码最小。

-xO3

类似于执行 -xO2,但还会优化外部变量的引用或定义。还执行循环解开和软件流水线作业。该级别不跟踪指针赋值的结果。在编译设备驱动程序或从信号处理程序内部修改外部变量的程序时,可能需要使用 volatile 类型限定符来保护对象,使其免于优化。一般说来,-xO3 级别会导致代码增大。

-xO4

类似于执行 -xO3,但是还自动内联包含在相同文件中的函数;这通常会提高执行速度。如果要控制内联哪些函数,请参见B.2.91 -xinline=list

该级别跟踪指针赋值的效果,通常导致代码增大。 

-xO5

试图生成最高优化级别。使用编辑时间更长或减少执行时间的程度不是很高的优化算法。如果使用配置文件反馈执行该级别上的优化,将更容易提高性能。请参见B.2.131 -xprofile=p

B.2.117.2 x86 优化的说明

下表描述了优化级别在 x86 平台上的工作原理。

表 B–32 x86 平台上的 -xO 标志

值 

含义 

-xO1

从内存、交叉跳跃(尾部合并)以及缺省优化的单个传递中预装入参数。 

-xO2

同时调度高级和低级指令,并执行改进的溢出分析、循环内存引用排除、寄存器生命周期分析、增强的寄存器分配以及全局通用子表达式的排除。 

-xO3

执行循环长度约简、感应变量排除以及在级别 2 完成的优化。

-xO4

除执行 -xO3 的优化之外,还自动内联包含在同一文件中的函数。自动内联通常会提高执行速度,但有时却会使速度变得更慢。通常该级别会增加代码的大小。

-xO5

生成最高级别优化。使用编辑时间更长或减少执行时间的程度不是很高的优化算法。其中包含为导出的函数生成局部的调用约定入口点、进一步优化溢出代码和增加分析,以改善指令调度。 

有关调试的更多信息,请参见《Sun Studio 12:使用 dbx 调试程序》手册。有关优化的更多信息,请参见《Sun Studio 12:性能分析器》手册。

另请参见 -xldscope-xmaxopt