最適化およびパフォーマンス
ネイティブ・イメージは、パフォーマンス、ファイル・サイズ、ビルド時間、デバッグ可能性およびその他のメトリックに関して、ユーザーが生成されたバイナリを最適化できるようにする様々なメカニズムを提供します。
最適化レベル
gcc
およびclang
と同様に、ユーザーは-O
オプションを使用して最適化レベルを制御できます。デフォルトでは、パフォーマンス、ファイル・サイズおよびビルド時間の良好なトレードオフを目標とする-O2
が使用されます。次の表に、様々な最適化レベルの概要を示し、それらが役立つ場合について説明します:
レベル | 最適化 | ユース・ケース |
---|---|---|
-Ob |
低減 | クイック・ビルド・モード: 時間のかかる最適化を回避することで、開発中のビルドを高速化します。場合によってはファイル・サイズも削減できます。 |
-Os |
低減 | サイズの最適化: -Os は、コードまたはイメージのサイズを大幅に増加する可能性があるものを除き、すべての-O2 の最適化を有効にします。通常は、パフォーマンスの低下と引き換えに、可能なかぎり最小のイメージが作成されます。 |
-O0 |
なし | 通常は、デバッグ・エクスペリエンスを向上させるために-g とともに使用されます。 |
-O1 |
基本 | パフォーマンスと引き換えにファイル・サイズとビルド時間を低減します。Oracle GraalVMの-O1 は、GraalVM Community Editionの-O2 にある程度似ています。 |
-O2 |
拡張 | デフォルト: 適度なファイル・サイズで良好なパフォーマンスを目標とします。 |
-O3 |
すべて | ビルド時間が長くなることと引き換えに、最高のパフォーマンスを目標とします。Oracle GraalVMによって、PGOビルド(--pgo オプション)に対して自動的に使用されます。-O3 と-O2 は、GraalVM Community Editionでは同一です。 |
スループット向上のためのプロファイルに基づく最適化
プロファイルに基づく最適化を使用して、スループットを向上させるためにアプリケーションを最適化することを検討してください。これらの最適化により、Graalコンパイラは、アプリケーションをAOTコンパイルする際に、JITコンパイラとして実行される場合と同様に、プロファイリング情報を活用することができます。この場合は、次のステップを実行します:
--pgo-instrument
を使用してアプリケーションをビルドします。- 代表的なワークロードを使用してインストゥルメントされたアプリケーションを実行し、プロファイリング情報を生成します。この実行から収集されたプロファイルは、デフォルトでdefault.iprofファイルに格納されます。
--pgo
オプションを使用してアプリケーションを再ビルドします。カスタム.iprofファイルを--pgo=<your>.iprof
で渡すことができます。それ以外の場合、default.iprofが使用されます。これにより、イメージが再ビルドされ、アプリケーションの最適化されたバージョンが生成されます。
このトピックの詳細は、「プロファイルに基づく最適化の基本的な使用法」を参照してください。
特定のマシン用の最適化
ネイティブ・イメージには、gcc
およびclang
と同様に動作する-march
オプションがあります。これにより、ユーザーは、コードをネイティブにコンパイルするときにGraalコンパイラが使用できる一連の命令を制御できます。デフォルトでは、ネイティブ・イメージはx86-64-v3
(x64)およびarmv8-a
(AArch64)を使用します。-march=list
を使用して、使用可能なすべてのマシン・タイプをリストします。生成されるバイナリが、デプロイ先のマシン・タイプと同じまたは類似しているマシン・タイプ上にビルドされる場合は、-march=native
を使用します。このオプションは、バイナリが生成されるマシン上で使用可能なすべての命令をコンパイラが使用するように指示します。これに対し、生成されるバイナリが、多くの異なった非常に古い可能性のあるマシンを持つユーザーに配布される場合は、-march=compatibility
を使用します。これにより、コンパイラで使用される一連の命令が最小限に抑えられるため、生成されたバイナリの互換性が向上します。
追加機能
ネイティブ・イメージは、生成されたバイナリをさらに最適化するための追加機能を提供します:
- 適切なガベージ・コレクタを選択し、ガベージ・コレクション・ポリシーを調整すると、GC時間を短縮できます。「メモリー管理」を参照してください。
- イメージのビルド中にアプリケーション構成をロードすると、アプリケーションの起動が高速化されます。イメージ・ビルド時のクラスの初期化を参照してください。
- ビルド出力では、ネイティブ・イメージを最大限に活用するのに役立つその他の推奨事項が提供される場合があります。ビルド出力: 推奨事項を参照してください。