最適化レベルの使用

コンパイラーがデフォルトで実行するのは、ローカルでの簡単な最適化 (定数のフォールディング、ローカルでの共通部分式の除去など) のみですが、完全なデバッグもサポートされています。プログラムは、さまざまな最適化レベルを指定することにより最適化できますが、最適化によってアプリケーションのパフォーマンスが向上すると、逆にプログラム・サイズやデバッグ・サポートは大きくなります。次の表に、指定できるオプションをまとめてあります。また、それぞれの最適化レベルで使用される手法の詳細説明は、後述します。

表 8. 最適化レベル

オプション 振る舞い
-O-O2-qoptimize、または -qoptimize=2 低レベルの包括的最適化。部分的なデバッグ・サポート。
-O3 または -qoptimize=3 より広範囲にわたる最適化。精度とのトレードオフあり。
-O4 または -qoptimize=4 プロシージャー間の最適化。ループの最適化。自動マシン調整。
-O5 または -qoptimize=5

最適化レベル 2 で使用される手法

最適化レベル 2 では、コンパイラーが適用する最適化手法は保守的であり、プログラムの正確さに影響を及ぼさないものとされます。最適化レベル 2 では、次の手法が使用されます。

最適化レベル 3 で使用される手法

最適化レベル 3 以上では、コンパイラーはよりアグレッシブになり、変更によって別の結果が生じるリスクを冒しても、プログラム・セマンティクスを変更してパフォーマンスの向上を図ります。次に、いくつか例を挙げます。

最適化レベル 2 および 3 の最大活用には、このリスクを少なくするための提案があります。

最適化レベル 3 では、最適化レベル 2 で使用されるすべての手法に加えて、次のような手法が使用されます。

最適化レベル 4 および 5 で使用される手法

最適化レベル 4 および 5 では、最適化レベル 2 および 3 で使用されるすべての手法に加えて、次のような手法が使用されます。

最適化レベル 2 および 3 の最大活用

ここでは、最適化レベル 2 および 3 を使用する際の、推奨される方法について説明します。

  1. 可能であれば、まず最適化しないでコードをテストおよびデバッグしてから、 -O2 を使用します。
  2. ご使用のコードが言語標準に準拠していることを確認します。
  3. C コードでは、ポインターの使用が次の制約事項に従っていることを確認してください。つまり、汎用ポインターは char* または void* でなければなりません。また、すべての共用変数および共用変数に対するポインターは、volatile でマークされている必要があります。
  4. C では、プログラムが独自の関数をライブラリー関数と同じ名前で定義しているのでない限り、 -qlibansi コンパイラー・オプションを使用します。
  5. コードのできるだけ多くの部分を、-O2 でコンパイルします。
  6. -O2 を使用して問題が発生する場合は、最適化を無効にする代わりに、 -qalias=noansi を使用することを検討してください。
  7. 次に、-O3 をできるだけ多くのコードに対して使用します。
  8. 問題が発生したり、パフォーマンスが低下したりする場合は、必要に応じて、 -O3 と一緒に -qstrict または -qcompact を使用することを検討してください。
  9. -O3 の使用時の問題が改善されない場合は、ファイルの一部に対しては -O2 に切り替えますが、 -qmaxmem=-1-qnostrict のいずれか、または両方を使用することを検討してください。
IBM Copyright 2003