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

Microbenchmark ではデフォルトで、実行されたコードの時間と割り当てに関する情報を取得できます。測定対象のコードの実行が遅い理由を調査する場合は、メソッド トレースを調べます(サポートされている OS バージョンではデフォルトでキャプチャされます)。または、他のプロファイリング構成を選択します。

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

オプションの詳細については、Java メソッド/Kotlin メソッドを記録するをご覧ください。そのドキュメントで定義されているとおり、MethodTracing はトレースと同等で、StackSampling はサンプリングと同等です。

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 でプロファイリング結果を確認するには、Microbenchmark の結果で [メソッド トレース] リンクまたは [スタック サンプリング トレース] リンクを選択します。

MethodTracing

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

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

メソッド トレースはデフォルトでオンになっています。

注: 一部の Android OS と ART バージョンでは、メソッド トレースはデフォルトでオフになっています。このような場合、Android Studio は警告を出力します。

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 秒です。
  • androidx.benchmark.profiling.skipWhenDurationRisksAnr

    • ANR が発生する可能性が高い場合は、メソッド トレースをスキップします。ANR は長時間の CI 実行中に問題を引き起こす可能性があるため、CI 実行ではこのオプションを有効にしておく必要があります。
    • 引数タイプ: ブール値
    • デフォルトは true です

なし

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