Jetpack Compose は、初期設定の状態で優れたパフォーマンスを実現します。ベスト プラクティスに沿ってアプリを構成し、よくある落とし穴を回避して、Compose アプリケーションのパフォーマンスを最適化します。
Android のスキル
GitHub で表示Jetpack Compose のパフォーマンス
android skills add jetpack-compose-performanceJetpack Compose のベンチマーク
Views と比較して Jetpack Compose のパフォーマンスを検証するために、ヒーロー ベンチマークを使用します。これは、アプリのコールド スタートや、画像を含むリストやグリッドのスクロールなど、重要な実際のユーザー ジャーニーに焦点を当てたベンチマークです。これらのベンチマークは、オープンソースの Pokedex アプリを使用して実施し、ビューと Compose の実装を比較しています。
これらのベンチマークは、Compose 1.9.0 以降、スクロール中のジャンクに関して Compose が View のパフォーマンスに匹敵することを示しています(Google Pixel 6 でジャンク 0% を達成)。
| Compose のバージョン | デバイス | ビューあたりの過剰なジャンク(pp) |
|---|---|---|
| 1.3.3 | Pixel 3a | +0.35 |
| 1.4.3 | Pixel 3a | +0.41 |
| 1.5.4 | Pixel 3a | +0.42 |
| 1.6.8 | Pixel 3a | +0.21 |
| 1.7.8 | Pixel 3a | +0.36 |
| 1.8.0 | Pixel 3a | +0.38 |
| 1.9.0 | Pixel 3a | 0 |
| 1.10.0 | Pixel 3a | 0 |
| 1.11 | Google Pixel 6 | 0 |
| 1.12 | Google Pixel 6 | 0 |
その他の指標と Google の手法については、ヒーロー ベンチマークをご覧ください。
主なコンセプト
Compose のパフォーマンスに関する主なコンセプトをいくつか紹介します。
- フェーズ: コンポジション、レイアウト、描画のフェーズを理解することは、Compose が UI を更新する方法を最適化するうえで重要です。
- ベースライン プロファイル: 重要なコードをプリコンパイルすることで、アプリの起動を高速化し、インタラクションをスムーズにします。
- 安定性: Compose が再コンポーズ中にパラメータを比較する方法を理解することで、コストのかかる等価性チェックを導入することなく、不要な作業をスキップできます。
アプリを適切に構成する
アプリのパフォーマンスが低い場合は、構成に問題があることが考えられます。最初のステップとして、次の構成オプションを確認することをおすすめします。
- R8 を使用してリリースモードでビルドする: リリースモードでアプリを実行してみてください。デバッグモードは多くの問題を見つけるために役立ちますが、パフォーマンスにコストがかかるため、他の問題を特定することが困難になる場合があります。また、R8 コンパイラで最適化と圧縮を有効にして、パフォーマンスと効率に優れたリリースビルドを作成する必要があります。
- ベースライン プロファイルを使用する: ベースライン プロファイルは、クリティカル ユーザー ジャーニーのコードをプリコンパイルすることで、パフォーマンスを向上させます。Compose にはデフォルトのプロファイルが含まれていますが、アプリ固有のプロファイルも作成することをおすすめします。ベースライン プロファイルの詳細については、Android のパフォーマンスに関する一般的なドキュメントをご覧ください
ツール
Compose アプリのパフォーマンスの測定と分析に役立つ一連のツールについて理解します。
ベスト プラクティス
Compose を使用してアプリを開発する際は、以下のベスト プラクティスを念頭に置いてください。
- 高コストの計算を避ける:
rememberを使用して、高コストの計算の結果をキャッシュに保存します。 - 遅延レイアウトをサポートする: 安定した
keyパラメータとcontentTypeパラメータを遅延レイアウトに提供して、不要な再コンポーズを最小限に抑え、スロットの再利用を可能にします。 - 不要な再コンポーズを制限する:
computedStateOf(Compose 1.13 以降)またはderivedStateOfを使用して、急速に変化する状態を読み取る際の再コンポーズを制限します。 - 状態の読み取りを延期する: 状態の読み取りをラムダ関数でラップすることで、可能な限り延期します。
- 状態の変更にラムダ修飾子を使用する: 頻繁に変化する状態変数には、
Modifier.offset { ... }などのラムダベースの修飾子を使用します。 - 逆方向書き込みを回避する: コンポーザブルですでに読み取られている状態に書き込まないでください。
詳しくは、ベスト プラクティス ガイドをご覧ください。
視聴回数
Compose ではなくビューを使用している場合は、専用のレイアウトのパフォーマンスを改善するガイドをご覧ください。
参考情報
- アプリのパフォーマンス ガイド: Android でのパフォーマンスを向上させるためのベスト プラクティス、ライブラリ、ツールについて説明します。
- パフォーマンスを検査する: アプリのパフォーマンスを検査します。
- ベンチマーク: アプリのパフォーマンスをベンチマークします。
- アプリの起動: アプリの起動を最適化します。
- ベースライン プロファイル: ベースライン プロファイルについて理解します。