在 SPARC 平台上:
–xO1 只执行最小量的优化 (peephole),也称为 postpass,即汇编级优化。除非使用 -xO2 或 -xO3 导致编译时间过长,或交换空间不足,否则请勿使用 -xO1。
–xO2 执行基本的局部和全局优化,包括:
归纳变量消除
局部和全局的通用子表达式消除
代数运算简化
复制传播
常量传播
非循环变体优化
寄存器分配
基本块合并
尾部递归消除
终止代码消除
尾部调用消除
复杂表达式扩展
该级别不优化外部变量或间接变量的引用或定义。
–xO3 除了执行在 –xO2 级别所执行的优化外,还会对外部变量的引用和定义进行优化。该级别不跟踪指针赋值的结果。编译未通过 volatile 适当保护的设备驱动程序或修改来自信号处理程序中的外部变量的程序时,请使用 – xO2。通常,使用此级别时会增加代码大小,除非将其与 -xspace 选项结合使用。
–xO4 除了执行 – xO3 优化外,还自动内联同一文件中的多个函数。自动内联通常会提高执行速度,但有时却会使速度变得更慢。通常,使用此级别时会增加代码大小,除非将其与 -xspace 选项结合使用。
–xO5 生成最高级别的优化。它只适用于占用大量计算机时间的小部分程序。该级别采用了占用更多编译时间或无法在某种程度上减少执行时间的优化算法。如果使用配置文件反馈执行该级别上的优化,则更容易提高性能。请参见A.2.162 -xprofile=p。
在 x86 平台上:
–xO1 执行基本优化。其中包括代数运算简化、寄存器分配、基本块合并、终止代码和存储消除以及 peephole 优化。
–xO2 执行局部通用子表达式消除、局部复制和常量传播、尾部递归消除以及级别 1 执行的优化。
–xO3 执行全局通用子表达式的消除、全局复制和常量传播、循环长度约简、归纳变量消除、循环变体优化以及级别 2 执行的优化。
–xO4 自动内联同一文件中的多个函数和级别 3 执行的优化。这种自动内联通常会提高执行速度,但有时却会降低速度。该级别还释放了通用的框架指针注册 (ebp)。通常该级别会增加代码的大小。
–xO5 生成最高级别的优化。该级别采用了占用更多编译时间或无法在某种程度上减少执行时间的优化算法。
如果使用 -g 或 -g0 且优化级别是 -xO3 或更低,编译器会为近乎完全优化提供尽可能多的符号信息。尾部调用优化和后端内联被禁用。
如果使用 -g 或 -g0 且优化级别是 -xO4 或更高,编译器会为完全优化提高尽可能多的符号信息。
使用 -g 进行调试不会抑制 –xOlevel,但 –xOlevel 会对 –g 造成一些限制。例如,–xOlevel 选项会降低调试的作用,因此无法显示 dbx 中的变量,但仍可使用 dbx where 命令获取符号回溯。有关更多信息,请参见《使用 dbx 调试程序》。
-xcrossfile 选项只有与 -xO4 或 -xO5 一起使用时才有效。
优化级别低于 -xO3 时,-xinline 选项不起作用。优化级别为 -xO4 时,优化器会决定应该内联哪些函数,而不管是否指定了 -xinline 选项。优化级别为 -xO4 时,编译器还会尝试确定内联哪些函数可以提高性能。如果使用 -xinline 强制内联函数,实际上可能会降低性能。
缺省为不优化。不过,只有不指定优化级别时才可能使用缺省设置。如果指定了优化级别,则没有任何选项可用来关闭优化。
如果尝试不设置优化级别,请不要指定任何隐含优化级别的选项。例如,-fast 是将优化级别设置为 -xO5 的宏选项。隐含优化级别的所有其他选项都会给出优化已设置的警告消息。不使用任何优化来编译的方法是从命令行删除所有选项或创建指定优化级别的文件。
如果在 –xO3 或 –xO4 级别上优化多个非常大的过程(一个过程有数千行代码),编译器会需要过多内存。在这些情况下,机器的性能就会降低。
为了防止性能降低,请使用 limit 命令限制单一进程可用的虚拟内存大小(请参见 csh(1) 手册页)。例如,将虚拟内存限制为 16MB:
example% limit datasize 16M |
如果虚拟内存达到 16 MB 的数据空间,该命令会使优化器尝试恢复。
限制不能大于机器总的可用交换空间,而且要足够的小以允许在大型编译的过程中机器可以正常使用。
数据大小的最佳设置取决于要求的优化程度、真实内存和可用虚拟内存的大小。
要查找实际的交换空间,请输入:swap– l
要查找实际的真实内存,请输入:dmesg | grep mem
-xldscope –fast、-xcrossfile=n、 –xprofile=p 和 csh(1) 手册页