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

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

Android には、アプリの異なる状況を分析およびテストできるように 2 つのベンチマーク ライブラリ(Microbenchmark と Macrobenchmark)が用意されており、それぞれに応じたアプローチがあります。

Microbenchmark

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

たとえば、アプリが複雑なデータ構造を処理する必要がある場合や、アプリの実行中に計算負荷の高い特定のアルゴリズムが何度も呼び出される場合は、ベンチマークの測定が必要です。UI の一部を測定することもできます。たとえば、RecyclerView アイテムのバインディングのコストはどれくらいか、レイアウトをインフレートするのにどれくらいの時間がかかるか、パフォーマンスの観点から View クラスの layout-and-measure パスの要求がどれくらい厳しいかを測定できます。

しかし、ベンチマーク対象のケースが全体的なユーザー エクスペリエンスにどのように影響するかを測定することはできません。いくつかの状況では、ジャンクやアプリ起動時間などのボトルネックが改善されているかどうかをベンチマークから知ることはできません。したがって、最初に Android Profiler を使用して、そうしたボトルネックを特定することが重要です。調査と最適化を行うべきコードが見つかったら、ベンチマーク対象のループを迅速かつ簡単に繰り返し実行することにより、ノイズが少ない結果を生成して改善が必要な領域に集中することができます。

Microbenchmark ライブラリは、アプリに関する情報のみをレポートし、システム全体に関する情報はレポートしません。したがって、システム全体の問題に関連するパフォーマンスではなく、アプリに固有の状況のパフォーマンスを分析するのに適しています。

Macrobenchmark

Macrobenchmark ライブラリは、起動、UI の操作、アニメーションのような上位レベルのエンドユーザー インタラクションを測定します。Macrobenchmark では、Microbenchmark ライブラリとは異なり、テスト対象のパフォーマンス環境を直接制御できます。そのため、アプリのコンパイル、起動、停止を制御することにより、すべてのディスク アクセスがキャッシュに保存された状態で、特定の JIT コンパイルされたホットな関数だけでなく、実際のアプリの起動やスクロールを直接測定できます。

このライブラリは、テストでビルドされたテストアプリを通じて外部からイベントを注入して、結果をモニタリングします。したがって、ベンチマークを作成する際は、アプリコードを直接呼び出すのではなく、ユーザーが操作する場合と同様にアプリを操作します。

ベンチマーク ライブラリの比較

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