スタイルによるパフォーマンス上のメリット

スタイルは、Compose のレイアウトと描画のフェーズで動作するように設計されています。これにより、スタイルは常にコンポジション フェーズをスキップするため、ラムダベースの修飾子を作成する必要がなくなります。

Compose のフェーズとスタイルの実行場所
図 1. Compose のフェーズと Styles の実行場所。

調整比に対するパフォーマンスの改善は、主に次の 3 つの最適化によるものです。

  • フェーズ シフト: スタイルは多くの場合、描画フェーズをターゲットにします。値が変更されると、Compose は完全な再コンポーズや再レイアウトをトリガーするのではなく、影響を受けるフェーズ(再描画など)のみを無効にします。
  • 遅延割り当て: アニメーションが実際に開始されるまで、アニメーション リソースの割り当てを遅延させるスタイル。これにより、最初のコンポジションで必要な作業が軽減されます。
  • オブジェクトのオーバーヘッドの削減: チェーンされた修飾子は、プロパティ(パディング、ボーダーなど)ごとにオブジェクトを割り当てます。スタイルは 1 つのラムダを使用して複数のプロパティを適用するため、メモリ割り当てが大幅に削減されます。テーマで Style が定義されている場合、そのラムダは、そのテーマを使用するすべてのコンポーネント間で共有されます。

次の表に、Compose 1.11.0-alpha06 の Styles の内部パフォーマンス ベンチマークの結果の例を示します。これは、Styles を使用しない Compose の実装と比較したものです。

basic_box_border_change テストでは、プロパティの更新中に複数の修飾子オブジェクトの割り当てを回避するスタイル システムの強みが明らかになりました。その結果、割り当てが約 77% 削減され、時間が約 59% 削減されました。

テスト方法

説明

Time Change

Allocation Change(割り当ての変更)

basic_box_border_change

Box の枠線の色を切り替えて、更新のパフォーマンスを測定します。

-59.91%

-77.22%

input_state_basic_box

スタイルベースのホバー/フォーカス/プレス状態と手動のインタラクション状態の収集を比較します。

-5.24%

-14.72%

basic_box

5 つのチェーンされた修飾子を持つ Box の初回コンポーズとレイアウトを測定します。

-4.78%

-6.60%

basic_text

ハードコードされた文字列を含む 5 つの BasicText コンポーネントをレンダリングします。

+0.62%

+2.41%

basic_text_provided_color

スタイルを使用してテキストの色を設定する場合と、CompositionLocalProvider を使用する場合を比較します。

+5.86%

+9.82%