最適化およびパフォーマンス

ネイティブ・イメージは、パフォーマンス、ファイル・サイズ、ビルド時間、デバッグ可能性およびその他のメトリックに関して、ユーザーが生成されたバイナリを最適化できるようにする様々なメカニズムを提供します。

最適化レベル

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では同一です。

スループット向上のためのプロファイルに基づく最適化

スループット向上のため、プロファイルに基づく最適化(PGO)を使用してアプリケーションを最適化することを検討してください。これらの最適化により、Graalコンパイラは、アプリケーションをAOTコンパイルする際に、JITコンパイラとして実行される場合と同様に、プロファイリング情報を活用することができます。この場合は、次のステップを実行します:

  1. --pgo-instrumentを使用してアプリケーションをビルドします。
  2. 代表的なワークロードを使用してインストゥルメントされたアプリケーションを実行し、プロファイリング情報を生成します。この実行から収集されたプロファイルは、デフォルトでdefault.iprofファイルに格納されます。
  3. --pgoオプションを使用してアプリケーションを再ビルドします。カスタム.iprofファイルを--pgo=<your>.iprofで渡すことができます。それ以外の場合、default.iprofが使用されます。これにより、イメージが再ビルドされ、アプリケーションの最適化されたバージョンが生成されます。

ノート: GraalVM Community Editionでは使用できません。

このトピックの詳細は、「プロファイルに基づく最適化の基本的な使用法」を参照してください。

パフォーマンス向上のためのML駆動型プロファイル推論

ネイティブ・イメージは、組込み機能として機械学習駆動型の静的プロファイリングをサポートしています。デフォルトでは、GraalVMは-O2最適化レベルで実行され、プロファイル推論に単純で高速なGraal静的プロファイラ(GraalSP)が使用されます。このモデルは、幅広いアプリケーション用に最適化されています。

GraalVM for JDK 24以降、新しいGraal Neural Network (GraalNN)静的プロファイラがML駆動のプロファイル推論に使用でき、さらに優れたパフォーマンスを提供します。-O3オプションをネイティブ・イメージに渡して有効にします。

ノート: GraalVM Community Editionでは使用できません。

ユーザーが--pgoオプションを使用してPGOプロファイルを指定した場合、追加のML推論は不要であるため、自動的に無効になります。

要点:

特定のマシン用の最適化

ネイティブ・イメージには、gccおよびclangと同様に動作する-marchオプションがあります。これにより、ユーザーは、コードをネイティブにコンパイルするときにGraalコンパイラが使用できる一連の命令を制御できます。デフォルトでは、ネイティブ・イメージはx86-64-v3 (x64)およびarmv8-a (AArch64)を使用します。-march=listを使用して、使用可能なすべてのマシン・タイプをリストします。生成されるバイナリが、デプロイ先のマシン・タイプと同じまたは類似しているマシン・タイプ上にビルドされる場合は、-march=nativeを使用します。このオプションは、バイナリが生成されるマシン上で使用可能なすべての命令をコンパイラが使用するように指示します。これに対し、生成されるバイナリが、多くの異なった非常に古い可能性のあるマシンを持つユーザーに配布される場合は、-march=compatibilityを使用します。これにより、コンパイラで使用される一連の命令が最小限に抑えられるため、生成されたバイナリの互換性が向上します。

追加機能

ネイティブ・イメージは、生成されたバイナリをさらに最適化するための追加機能を提供します: