- JDK 23用GraalVM (最新)
- JDK 24用GraalVM (早期アクセス)
- JDK 21用GraalVM
- JDK 17用GraalVM
- アーカイブ
- 開発ビルド
LCOVを使用したPGOレポートの理解
ここでは、LCOVベースのツールを使用してPGOプロファイルを分析する方法を学習します。
プロファイルに基づく最適化(PGO)は、ネイティブアプリケーションのパフォーマンスを最大化するのに役立ちます。 PGOプロセスの一環として、インストルメント化されたバイナリを作成し、それにワークロードを実行してPGOプロファイルファイルを生成します。このファイルをビルドプロセスにフィードバックして、アプリケーションの最適化されたバイナリを生成できます。 通常、このようなPGOプロファイルの内容を理解する必要はありません。 ただし、場合によっては、特に最適化されたバイナリのパフォーマンスに問題がある場合に、プロファイルの一部として何が記録されたかを理解したい場合があります。 GraalVMネイティブイメージは、LCOV形式の追加ファイルにプロファイリング情報をエクスポートできます。 LCOV形式をサポートするIDEまたはツールで、このようなファイルを開いて視覚化できます。 これにより、コードのどのメソッドが呼び出され、どのくらいの頻度で呼び出されるかを確認できます。
Graalコンパイラは、数回しか呼び出されない、またはまったく呼び出されない*コールドメソッド*よりも、何度も呼び出される*ホットメソッド*の最適化に多くの時間を費やします。 したがって、追加のLCOVエクスポートを使用して、インストルメント化されたバイナリで実行されたワークロードの一部として実際にどのメソッドが呼び出されたかを確認できます。 これは、PGOプロファイルにメソッドの適切なプロファイリング情報が含まれていることも意味します。 また、カバレッジの視覚化は、インストルメント化されたバイナリで実行されたワークロードについて、アプリケーションのホットメソッドを特定するのに役立ちます。 パフォーマンスを最大化したい場合は、通常、これらが詳しく調べるメソッドです。 逆に、まったくカバーされていないメソッドは、クリーンアップの潜在的な候補であり、ビルド時間を短縮できます。
カバレッジレポートの作成 #
カバレッジレポートを作成するには、まず、インストルメント化されたバイナリをビルドするときに、 `--pgo-instrument`オプションとともに`-H:+ProfilingLCOV`実験オプションを渡す必要があります。 例えば
native-image -cp . GameOfLife -o gameoflife-instrumented --pgo-instrument -H:+UnlockExperimentalVMOptions -H:+ProfilingLCOV -H:-UnlockExperimentalVMOptions
レポートは、`.info`トレースファイルの形式で、インストルメント化されたアプリケーションを実行した後にプロファイルとともに生成されます。 プロファイリングと同様に、 `-XX:ProfilesLCOVTraceFile`オプションを使用して、生成された情報ファイルの宛先をさらにカスタマイズできます。 例えば
./gameoflife-instrumented -XX:ProfilesLCOVTraceFile=gameoflife-coverage.info
生成されたLCOVトレースファイルは、メソッドレベルでカバレッジ情報を提供します。つまり、特定のメソッドが実行されたかどうか(および回数)を提供します。 この情報は、 `lcov`コマンドを使用して簡単に要約できます(公式のLCOVマニュアルページを参照)。 例えば
lcov --summary gameoflife-coverage.info
これは、次の形式で簡単な要約を出力します。
Summary coverage rate:
lines......: 17.3% (24873 of 144172 lines)
functions..: 15.6% (2390 of 15285 functions)
branches...: no data found
さらに、データを視覚化するために、LCOVデータからHTMLレポートを作成するための `genhtml`ユーティリティを使用するか、サードパーティのLCOVデータビジュアライザー(例: LCOVビューアープロジェクト)を使用できます。
どのメソッドがインストルメント化されているか(見つかったか)、どのメソッドが実行されているか(ヒットしているか)を表示するために、 `genhtml`はさらにソースファイルを利用します( `--synthesize-missing`オプションを使用して利用できない場合は省略することもできます)。 また、 `--source-directory`オプションは、ソースファイルが特定のディレクトリにある場合に役立ちます。 例えば
genhtml --source-directory *absolute-path-to-sources* gameoflife-coverage.info
前のコマンドによって生成された`gameoflife-coverage.info`トレースファイルのレポートからのソースファイルビューの例を以下に示します。
さらに、 `functions`ビューには、特定のソースファイルで見つかったすべてのメソッドと、それらの実行回数が一覧表示されます。