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
トレース・ファイルのレポートから、ソース・ファイル・ビューの例を次に示します:
さらに、functions
ビューには、特定のソース・ファイルで検出されたすべてのメソッドが実行数とともにリストされます: