ヒーロー ベンチマーク

ヒーロー ベンチマークは、オープンソースの Pokedex アプリでのアプリの起動やスクロールなど、アプリのユーザー ジャーニーを高いレベルでカバーする一連のベンチマークです。

  • 起動ヒーロー ベンチマーク: アプリを開いてからコンテンツが表示されるまでの時間をトラッキングします。
  • スクロール ヒーロー ベンチマーク: 画像を含む遅延グリッドのスクロール パフォーマンスを測定します。

テストのセットアップ

  • アプリの選択: これらのテストは、オープンソースの Pokedex アプリを使用して実施し、View ベースのバージョンと Compose ベースのバージョンを比較しました。このアプリは、現実世界のシナリオを表現するために選ばれたもので、Compose チームが開発したものではありません。
  • ハードウェアの設定: ベンチマークは、Android 17(API 37)を搭載した Google Pixel 6 で、CPU と GPU をロックして実行されました。Compose 1.12 より前は、Google Pixel 3a でベンチマークが実施されていました。Compose 1.12 以降、Google Pixel 6 がヒーロー ベンチマークの標準パフォーマンス ベースラインとして使用されます。
  • ビルド設定: ベンチマークでは、R8 を有効にしてリリースモードでビルドされたアプリを使用します。アプリは完全にプリコンパイルされ、実行時(JIT)コンパイルによる不安定さが軽減されます。
  • 結果の選択: ワーストケース分析を確実にするため、極端な外れ値と代表的でないノイズはベンチマーク結果から除外されました。次に、上限パフォーマンス データの中央値を選択してベースラインを確立しました。

スタートアップ ヒーローのベンチマーク

起動を測定するには、PokedexStartupBenchmark を使用しました。PokedexStartupBenchmark は、Pokedex アプリがユーザーに表示されるまでの時間を測定します。

アプリの起動は、コールド スタート、ウォーム スタート、ホットスタートの 3 つの状態のいずれかで行われます。それぞれの状態は、アプリがユーザーに表示されるまでの時間に影響します。コールド スタートでは、アプリはゼロからスタートします。このベンチマークでは、コールド スタート状態でのアプリの起動パフォーマンスを測定します。Google では、常にコールド スタートを想定してアプリを最適化することをおすすめします。そうすれば、ウォーム スタートとホットスタートのパフォーマンスも向上させることができます。

アプリの起動時間を測定するために使用する指標は、初期表示までの時間と完全表示までの時間です。

初期表示までの時間

初期表示までの時間(TTID)は、アプリが最初のフレームを生成するのにかかる時間を測定します。これには、コールド スタート中のプロセスの初期化、コールド スタートおよびウォーム スタート中のアクティビティの作成、最初のフレームの表示が含まれます。

PokedexStartupBenchmark では、コールド スタート時の TTID に関して、Compose 1.12 は View と同等です。

初期表示までの時間(ミリ秒単位、Google Pixel 6 でテスト)
バージョン初期表示までの時間(ミリ秒)
Compose 1.12149
視聴回数151
図 1: Compose 1.12 とビューの TTID の比較。

完全表示までの時間

完全表示までの時間(TTFD)は、アプリが操作可能になるまでの時間を測定します。これは、すべてのデータが読み込まれ、描画されたことを意味します。完全表示までの時間について詳しくは、アプリの起動時間をご覧ください。

PokedexStartupBenchmark では、コールド スタートでの TTFD について、Compose 1.12 は Views よりも約 2% 遅くなっています。

完全表示までの時間(ミリ秒単位、Google Pixel 6 でテスト)
バージョン完全表示までの時間(ミリ秒)
Compose 1.12202
視聴回数193
図 2: TTFD の Compose 1.12 とビューの比較。

スクロール ヒーロー ベンチマーク

スクロールのパフォーマンスを測定するために、PokedexScrollBenchmark を使用しました。このテストでは、画像を含む遅延グリッドの Pokedex アプリ画面のスクロール パフォーマンスを測定します。このベンチマークでは、画面全体が複数回スクロールおよびフリングされ、新しいアイテムが読み込まれます。スクロールのパフォーマンスは、ジャンク率で測定されます。

ジャンク率

Android デバイスは、最大 60 または 120 フレーム/秒(fps)でレンダリングします。つまり、システムにはフレームを生成するための厳格な期限(たとえば、60 fps の場合は 16.6 ミリ秒)があります。アプリの処理に時間がかかりすぎると、ジャンクと呼ばれる目に見えるカクつきが発生することがあります。

PokedexScrollBenchmark では、Compose 1.9.0 以降、Compose のパフォーマンスは View と同等で、過剰なジャンクは 0 パーセント ポイントです。Google Pixel 6(Compose 1.11 以降でテスト済み)では、Compose と View の両方でジャンク率 0% を達成しています。

Compose バージョン別の、ビューに対する Compose の過剰なジャンクの割合(低いほど良い)
Compose のバージョンデバイスビューあたりの過剰なジャンク(pp)
1.3.3Pixel 3a+0.35
1.4.3Pixel 3a+0.41
1.5.4Pixel 3a+0.42
1.6.8Pixel 3a+0.21
1.7.8Pixel 3a+0.36
1.8.0Pixel 3a+0.38
1.9.0Pixel 3a0
1.10.0Pixel 3a0
1.11Google Pixel 60
1.12Google Pixel 60
図 3: Compose 1.9.0 以降、Compose はビューのスクロール ジャンクに一致します。

ヒーロー ベンチマークを実行する

パフォーマンスの結果を検証し、ベンチマークをローカルで実行するには:

  1. AndroidX ガイドに沿ってソースコードをチェックアウトします。
  2. Hero Benchmarks のソースコードの README の手順に沿って、ベンチマークとターゲット APK(pokedex-macrobenchmark と pokedex-macrobenchmark-target)をビルドし、テストデバイスにインストールして、adb または Android Studio を使用して PokedexStartupBenchmark スイートと PokedexScrollBenchmark スイートを実行します。

これらのベンチマークは、アプリの最適化対象となる特定のデバイスなど、サポートされている任意のデバイスで実行できます。ただし、公式の結果を検証するには、同じハードウェア設定を使用します。