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

設計上、スタイルは Compose のレイアウト フェーズと描画フェーズで動作します。スタイルは常にコンポジション フェーズをスキップするため、ラムダベースの修飾子を作成する必要はありません。

Compose のフェーズとスタイルの実行場所
図 1.Compose のフェーズとスタイルが実行される場所。

修飾子に対するパフォーマンスの改善は、次の 3 つの主な最適化によるものです。

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

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

basic_box_border_change テストでは、プロパティの更新時に複数の修飾子オブジェクトの割り当てを回避するスタイル システムの強みが示されています。これにより、割り当てが約 77% 削減され、時間が約 59% 短縮されています。

テスト方法

説明

時間の変化

割り当ての変化

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%