LCOVを使用したPGOレポートの活用

ここでは、LCOVベースのツールの支援によってPGOプロファイルを分析する方法を学習します。

プロファイルに基づく最適化(PGO)は、ネイティブ・アプリケーションのパフォーマンスを最大化するのに役立ちます。PGOプロセスの一環として、インストゥルメントされたバイナリを作成し、それに対してワークロードを実行してPGOプロファイル・ファイルを生成します。そのファイルをビルド・プロセスにフィードバックして、アプリケーションの最適化されたバイナリを生成できます。通常、このようなPGOプロファイルの内容を理解する必要はありません。ただし、場合によっては、特に最適化されたバイナリのパフォーマンスに問題がある場合に、プロファイルの一部として記録された内容を理解することが望まれます。GraalVMネイティブ・イメージは、LCOV形式の追加ファイルでプロファイリング情報をエクスポートできます。このようなファイルは、LCOV形式をサポートする任意のIDEまたはツールで開いてビジュアル化できます。これにより、コールされるコードのメソッドと頻度を確認できます。

Graalコンパイラは、ホット・メソッド、つまりコールド・メソッド(数回のみコールされるメソッド、またはまったくコールされないメソッド)よりも多く何度もコールされるメソッドの最適化に多くの時間を費やします。したがって、追加のLCOVエクスポートを使用して、インストゥルメントされたバイナリで実行されたワークロードの一部として実際にコールされたメソッドを確認できます。これは、PGOプロファイルにメソッドの適切なプロファイリング情報が含まれていることも意味します。また、カバレッジ・ビジュアライゼーションは、インストゥルメントされたバイナリで実行されたワークロードに対して再度、アプリケーションのホット・メソッドを識別するのに役立ちます。パフォーマンスを最大化する場合、通常はこれらのメソッドを詳細に調査します。反対に、まったくカバーされていないメソッドは、ビルド時間を高速化できるクリーンアップの潜在的な候補です。

カバレッジ・レポートの作成

カバレッジ・レポートを作成するには、インストゥルメントされたバイナリをビルドする際に、まず-H:+ProfilingLCOV試験段階オプションを--pgo-instrumentオプションとともに渡す必要があります。たとえば:

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 manページを参照)。たとえば:

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

また、データをビジュアル化するために、genhtmlユーティリティを使用してLCOVデータからHTMLレポートを作成したり、サードパーティのLCOVデータ・ビジュアライザ(LCOVビューア・プロジェクトなど)を使用したりできます。

インストゥルメントされた(検出された)メソッドと実行された(ヒットした)メソッドを表示するために、genhtmlはソース・ファイルを追加で利用します(--synthesize-missingオプションを使用して利用できない場合は省略することもできます)。また、--source-directoryオプションは、ソース・ファイルが特定のディレクトリにある場合に役立ちます。たとえば:

genhtml --source-directory *absolute-path-to-sources* gameoflife-coverage.info

前のコマンドで生成されたgameoflife-coverage.infoトレース・ファイルのレポートから、ソース・ファイル・ビューの例を次に示します:

LCOV Genhtmlレポート - ソース・ビュー

さらに、functionsビューには、特定のソース・ファイルで検出されたすべてのメソッドが実行数とともにリストされます:

LCOV Genhtmlレポート - 関数ビュー

その他の情報