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

ベンチマークは、アプリのパフォーマンスを検査およびモニタリングするための手段です。ベンチマークを定期的に実施すると、パフォーマンスに関する問題の分析とデバッグを行い、最新の変更で回帰が発生していないことを確認できます。

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

Macrobenchmark

Macrobenchmark ライブラリは、起動、UI の操作、アニメーションのような上位レベルのエンドユーザー インタラクションを測定します。このライブラリでは、テスト対象のパフォーマンス環境を直接制御できます。そのため、アプリのコンパイル、起動、停止を制御することにより、実際のアプリの起動やスクロールを直接測定できます。

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

Microbenchmark

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

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

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

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

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

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