Visual Fortran は,省略時にさまざまな最適化を実行します。これらの最適化は,プログラムのコードを変更しなくても利用することができます。しかし,最適化がどのように働くかを理解しておけば,その動作を妨げるような要素をプログラムから取り除いておくことができます。
コンパイル時に実行,削除,または単純化できる演算があった場合,Visual Fortran は実行時にではなく,コンパイル時にその演算を行います。より多くの最適化が適用されるに従い,プログラムのコンパイルに要する時間は一般に増大します。
/optimize:4 でコンパイルを行うと,それよりも低いレベルの最適化でプログラムをコンパイルしたときよりもプログラムの実行速度は一般に高くなりますが,コンパイルに要する時間は長くなります。
オブジェクト・ファイルの大きさは,どのような最適化を要求したかによって異なります。オブジェクト・ファイルの大きさを増やす要因には,ループ展開や手続のインライン展開などがあります。
次表は,Compaq Fortran の各種の /optimize:num オプションでの最適化レベルを示しています。たとえば,/optimize:0 は選択可能な最適化をまったく使用しないことを指定します。一部の最適化はつねに実行されます。/optimize:5 を使用すると,そのアーキテクチャーで利用できるすべての最適化レベルを指定することができます。ia32 システムでの /optimize:5 にはループ変換が含まれます。ia64 システムでの /optimize:5 には,ループ変換とソフトウェア・パイプラインが含まれます。
各種の /optimize:num オプションでの最適化レベル
最適化の形式 | /optimize:0 | /optimize:1 | /optimize:2 | /optimize:3 | /optimize:4 | /optimize:5 |
ソフトウェア・パイプライン | x (ia64 のみ) | |||||
ループ変換 | x | |||||
自動インライン展開 | x | x | ||||
付加的な大域的な最適化 | x | x | x | |||
大域的な最適化 | x | x | x | x | ||
局所的な (最小限の) 最適化 | x | x | x | x | x |
コマンド行と「Release」構成のビジュアル開発環境の基本レベルは,/optimize:4 です。「Debug」構成のビジュアル開発環境の基本レベルは,/optimize:0 です。ただし,/debug が指定されていると,基本レベルは /optimize:0 (最適化なし) になります。
上表では,最適化のレベルの説明に次の用語を使用しています。これらの用語については,後の節で詳しく説明しています。
プログラム単位中で起こり,共通部分式の認識や,乗算と除算の展開などが含まれます。
データ・フロー解析,コードの移動,力の縮小,スプリット・ライフタイム解析,および命令のスケジューリングが含まれます。
コードの大きさが増えることと引き換えに,実行速度を改善します。これらの最適化には,ループ展開,飛越しをなくすためのコードの模写,およびキャッシュを効率的に使用するために配列の大きさを 2 のべき乗で充填することが含まれます。
通常はコードの大きさの増加を制限する自己判断を使用しながら,手続間解析と小さな手続のインライン展開を適用します。
一連のループ変換の最適化と,ia64 システムではソフトウェア・パイプライン最適化が含まれます。ループ変換の最適化は,ループ内の配列引用に適用され,複数のループの入れ子に適用することができます。ループ変換の最適化はメモリー・システムの性能を向上させることができます。
ia64 システムでは,ソフトウェア・パイプラインは特定の最内部ループに命令スケジューリングを適用します。これにより,ループ内の命令は「ラップ・ラウンド」して,ループの異なる繰り返しの中で実行できるようになります。これにより,長待ち時間操作の影響が抑えられ,ループの実行が高速化されます。また,ソフトウェア・パイプラインではデータの先取りを行うことで,キャッシュの不足の影響が抑えられます。
次に示す節では,I/O 性能の注意事項を詳しく説明しています。