Microbenchmark をプロファイリングする

Microbenchmark ではデフォルトで、実行されたコードの時間と割り当てに関する情報を取得できます。測定対象のコードの実行が遅い理由を調査する場合は、CPU Profiler を接続してベンチマークを実行できます。

プロファイラ構成を選択するには、計測ランナー引数 androidx.benchmark.profiling.modeMethodTracingStackSamplingNone 引数のいずれかに追加します(以下のスニペットを参照)。

これらのオプションについて詳しくは、記録構成を選択するをご覧ください。そのドキュメントで定義されているとおり、MethodTracing は「Trace Java Methods」に相当し、StackSampling は「Sample Java Methods」に相当します。

Groovy

android {
    defaultConfig {
        // must be one of: 'None', 'StackSampling', or 'MethodTracing'
        testInstrumentationRunnerArguments["androidx.benchmark.profiling.mode"]= 'StackSampling'
    }
}

Kotlin

android {
    defaultConfig {
        // must be one of: 'None', 'StackSampling', or 'MethodTracing'
        testInstrumentationRunnerArguments["androidx.benchmark.profiling.mode"] = "StackSampling"
    }
}

ベンチマークをプロファイリングすると、.trace 出力ファイルがホスト上の JSON 結果と同じディレクトリにコピーされます。Android Studio の CPU Profiler でプロファイリング結果を確認するには、[File] > [Open] を選択します。トレースの確認と理解について詳しくは、トレースを検証するをご覧ください。

MethodTracing

メソッド トレースは他のメソッドよりも実行に時間がかかっているメソッドを特定でき、コードの最適化をする場合に便利です。これにより、パフォーマンスに最も影響のあるメソッドに特化して最適化できます。

プロファイリングはコード測定の後に順番に行われるため、テストでは正確なタイミングとプロファイリング結果の両方が出力されます。

StackSampling

メソッド トレースのパフォーマンス オーバーヘッドを使用せずに、サンプル トレースでもコストの高いメソッドを特定できます。ただし、コールスタックがキャプチャされた後にアプリがメソッドを開始し、次のキャプチャの前にメソッドが終了した場合、メソッド呼び出しはログに記録されません。ライフサイクルが短いメソッドを適切にトラッキングするには、サンプル トレースではなく、メソッド トレースを使用します。

スタック サンプリングでは、ウォームアップが完了した後、ベンチマークがコールスタックをサンプリングします。計測引数を使用して、サンプリング頻度サンプリング期間を制御できます。

Android 10(API 29)以降の場合、スタック サンプリングでは Simpleperf によりアプリのコールスタック(C++ コードを含む)がサンプリングされます。Android 9(API 28)以前の場合は、Debug.startMethodTracingSampling によりスタック サンプルがキャプチャされます。

このプロファイリング モードを構成するには、次に示す別の計測引数を追加します。

  • androidx.benchmark.profiling.sampleFrequency

    • キャプチャする 1 秒あたりのスタック サンプル数
    • 引数の型: 整数
    • デフォルトは毎秒 1,000 サンプルです。
  • androidx.benchmark.profiling.sampleDurationSeconds

    • ベンチマークを実行する期間
    • 引数の型: 整数
    • デフォルトは 5 秒です。

None

この引数はプロファイリング ファイルをキャプチャしません。この場合も時間と割り当てに関する情報は測定されます。