最適化レベルを指定します。一般的に、プログラムの実行速度は最適化のレベルに依存します。最適化レベルが高いほど、実行速度が速くなります。
-xO[level] を指定しないと、非常に基本的なレベルの最適化しか行われません。つまり、最適化は、式の局所的な共通部分を削除することと、デッドコードを分析することに限定されます。最適化レベルを指定してコンパイルすると、プログラムのパフォーマンスが著しく向上することがあります。ほとんどのプログラムの場合、-O (暗黙的に -xO2 を指定する) の使用をお勧めします。
一般に、プログラムをより高い最適化レベルでコンパイルすれば、実行時のパフォーマンスはそれだけ向上します。しかし、最適化レベルが高ければ、それだけコンパイル時間が増え、実行可能ファイルが大きくなる可能性があります。
ごくまれに、-x02 の方が他の値より実行速度が速くなることがあり、-x03 の方が -x04 より速くなることがあります。すべてのレベルでコンパイルを行なってみて、こうしたことが発生するかどうか試してみてください。
メモリー不足になった場合、オプティマイザは最適化レベルを落として現在の手続きをやり直すことによってメモリーを回復しようとします。ただし、以降の手続きについては、-xO オプションで指定された最適化レベルを使用します。
-xO には 5 つのレベルがあります。以降では各レベルが SPARC プラットフォーム、x86 プラットフォーム、および両プラットフォームでどのように動作するかを説明します。
SPARC プラットフォームの場合:
-xO は -xO2 と同じことです。
-xO1 では、最小限の最適化 (ピープホール) が行われます。これはコンパイルの後処理におけるアセンブリレベルでの最適化です。-xO2 や -xO3 を使用するとコンパイル時間が著しく増加する場合や、スワップ領域が不足する場合だけ -xO1 を使用してください。
-xO2 では、次の基本的な局所的および大域的な最適化が行われます。
帰納的変数の削除
局所的および大域的な共通部分式の削除
計算の簡略化
コピーの伝播
定数の伝播
ループ不変式の最適化
レジスタ割り当て
基本ブロックのマージ
末端再帰の削除
デッドコードの削除
末端呼び出しの削除
複雑な式の展開
このレベルでは、外部変数や間接変数の参照や定義は最適化されません。一般に、このレベルを使用するとコードサイズが最小になります。
-xO3 では、-xO2 レベルで行う最適化に加えて、外部変数に対する参照と定義も最適化されます。このレベルでは、ポインタ代入の影響は追跡されません。volatile で適切に保護されていないデバイスドライバをコンパイルする場合か、シグナルハンドラの中から外部変数を修正するプログラムをコンパイルする場合は、-xO2 を使用してください。一般に -xO3 を使用すると、コードサイズが大きくなります。スワップ領域が不足する場合は、-xO2 を使用してください。
-xO4 では、-xO3 レベルで行う最適化レベルに加えて、同じファイルに含まれる関数のインライン展開も自動的に行われます。インライン展開を自動的に行なった場合、通常は実行速度が速くなりますが、遅くなることもあります。一般に、このレベルを使用するとコードサイズが大きくなります。
-xO5 では、最高レベルで最適化が行われます。これを使用するのは、コンピュータの最も多くの時間を小さなプログラムが使用している場合だけにしてください。このレベルで使用される最適化アルゴリズムでは、コンパイル時間が増えたり、実行時間が改善されないことがあります。このレベルの最適化によってパフォーマンスが改善される確率を高くするには、プロファイルのフィードバックを使用します。「-xprofile=p」 を参照してください。
x86 プラットフォームの場合:
-xO1 では、引数がメモリーから事前にロードされます。その結果、デフォルトの最適化の第 1 段階で行われる単純な最適化に加え、クロスジャンプ (末尾のマージ) も行われます。
-xO2 では、レベル 1 で行われる最適化に加えて、高レベルと低レベルの命令のスケジューリング、スピル解析、ループメモリー参照の削除、レジスタ寿命解析、レジスタ割り当ての強化、大域的な共通部分式の削除が行われます。
-xO3 では、レベル 2 で行われる最適化に加えて、ループ力の縮小とインライン展開が行われます。
-xO4 では、レベル 3 で行われる最適化に加えて、アーキテクチャ固有の最適化が行われます。
-xO5 では、最高レベルの最適化が行われます。このレベルで使用される最適化アルゴリズムでは、コンパイル時間が増えたり、実行時間が改善されないことがあります。
-g でデバッグしても -xO[level] には影響はありませんが、 -xO[level] は -g の内容を制限することがあります。
-xO3 と -xO4 オプションではデバッグに制限が生じるため dbx から変数を表示することはできませんが、dbx の where コマンドを使用すればシンボルによる追跡が可能です。
最適化レベルが -x03 より低い場合、-xinline オプションは何の働きもしません。 -x04 では、オプティマイザは、インライン展開するべき関数を決定します (この決定は、 -xinline オプションを指定しなかった場合も行われます)。-x04 では、コンパイラもまた、インライン展開した場合にパフォーマンスの向上につながる関数を特定しようとします。-xinline を使用して関数を強制的にインライン展開した場合、実際にはパフォーマンスが低下することがあります。
大規模な手続き (数千行のコードからなる手続き) に対して -x03 または -x04 を指定して最適化をすると、途方もない大きさのメモリーが必要になり、マシンのパフォーマンスが低下することがあります。
こうしたパフォーマンスの低下を防ぐには、limit コマンドを使用して、1 つのプロセスで使用できる仮想メモリーの大きさを制限します (csh(1) のマニュアルページを参照)。たとえば、使用できる仮想メモリーを 16M バイトに制限するには、次のコマンドを使用します。
demo% limit datasize 16M
このコマンドにより、データ領域が 16M バイトに達したときに、オプティマイザがメモリーを回復しようとします。
マシンが使用できるスワップ領域の合計容量を超える値は、制限値として指定することはできません。制限値は、大規模なコンパイル中でもマシンの通常の使用ができるぐらいの大きさにしてください。
最良のデータサイズ設定値は、要求する最適化のレベルと実メモリーの量、仮想メモリーの量によって異なります。
実際のスワップ空間に関する情報を得るには、swap -l と入力します。
実際の実メモリーに関する情報を得るには、dmesg | grep mem と入力します。
-fast、-xprofile=p、csh(1) のマニュアルページ