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

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

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 分を超える場合もある)1 分を超える場合もあります。 反復処理は高速(ほとんどの場合は 10 秒未満)10 秒未満であることがほとんどです。
トレース 結果にプロファイリング トレースが含まれる オプションでメソッド サンプリングとトレースを利用可能