アプリのベンチマークを行う

ベンチマークは、アプリのパフォーマンスをテストする方法です。ベンチマークを定期的に実行すると、パフォーマンスに関する問題の分析とデバッグに役立ちます。また、最新の変更で回帰が発生していないことも確認できます。

Android は、Benchmark および Macrobenchmark という 2 つのライブラリとアプローチを提供しています。これらは、アプリのさまざまな状況の分析とテストに役立ちます。

Benchmark と Macrobenchmark の比較

Jetpack Benchmark ライブラリを使用すると、アプリコードのベンチマークをループ内で直接測定できます。このライブラリは、内部ループや特定のホットな関数で見られるようなベストケースのパフォーマンス(ウォームアップされた JIT、キャッシュされたディスク アクセス)を評価する CPU 処理を測定するために設計されています。

次のように、測定対象のコードを直接呼び出すベンチマークが作成されます。

@get:Rule
val benchmarkRule = BenchmarkRule()

@Test
fun myBenchmarkTest() {
    benchmarkRule.measureRepeated {
        // code or function call that you want to benchmark
    }
}

Benchmark ライブラリは、システム全体ではなく、アプリのみに関する情報を報告します。したがって、システム全体の問題に関連するパフォーマンスではなく、アプリ固有の状況のパフォーマンスを分析する場合に適しています。たとえば、アプリの起動にはアプリの外部で発生するオペレーションとアプリコードの実行前に発生するオペレーションが含まれているため、起動のパフォーマンスに関する問題を調査する場合は、この情報を確認すると有用です。Microbenchmark テストは、このユースケースの修正には役立ちません。

Macrobenchmark は、起動、スクロール、アニメーションなどの大規模なエンドユーザー インタラクションを測定します。Benchmark ライブラリとは異なり、Macrobenchmark は、デベロッパーが提供するテストアプリを通じて外部からイベントを注入し、結果をモニタリングします。

Macrobenchmark では、テスト対象のパフォーマンス環境を直接制御できます。たとえば、「ウォーム」起動と「ホット」起動のオプションに加えて、初回インストール時の「コールド」起動のパフォーマンスを指定できます。以下の例は、Macrobenchmark サンプルをベースにしています。

@Test
fun startup() = benchmarkRule.measureStartup(
    packageName = "mypackage.myapp",
    metrics = listOf(StartupTimingMetric()),
    iterations = 5,
    startupMode = StartupMode.COLD
) {
    pressHome()
    startActivityAndWait(Intent().apply {
        action = "mypackage.myapp.myaction"
    })
}

結果の一部として、Macrobenchmark は Android Studio で表示できるトレース ファイルを生成します。これにより、パフォーマンスに関する問題を特定して分析とデバッグを行えます。

Benchmark Macrobenchmark
個々の関数を測定する 大まかなエントリ ポイントを測定する(アクティビティの起動、リストのスクロールなど)
CPU 処理をプロセス内でテストする アプリ全体をプロセス外でテストする
反復処理は高速(ほとんどの場合は 10 秒未満) 反復処理は中程度(ほとんどの場合は 1 分超)
オプションでメソッド サンプリングとトレースを利用可能 結果にプロファイリング トレースが含まれる
最小 API は 14 最小 API は 23