使用样式带来的性能优势

根据设计,样式在 Compose 的布局和绘制阶段运行。这样一来,就不需要创建基于 lambda 的修饰符,因为样式始终会跳过组合阶段。

Compose 的阶段以及样式运行的位置
图 1. Compose 的阶段以及样式运行的位置。

与修饰符相比,性能提升主要得益于以下三项优化:

  • 阶段转移:样式通常以 Draw 阶段为目标。当值发生更改时,Compose 只会使受影响的阶段(例如,重绘)失效,而不会触发完整的重组或重新布局。
  • 延迟分配:样式会延迟动画资源分配,直到动画实际开始。这样可以减少初始撰写期间所需的工作量。
  • 减少了对象开销:链式修饰符会为每个属性(例如内边距、边框)分配一个对象。样式使用单个 lambda 来应用多个属性,从而显著减少内存分配。如果某个样式是在主题中定义的,则该 lambda 会在所有使用相应主题的组件之间共享。

下表显示了 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

使用硬编码的字符串渲染五个 BasicText 组件。

+0.62%

+2.41%

basic_text_provided_color

比较通过样式设置文字颜色与使用 CompositionLocalProvider 设置文字颜色。

+5.86%

+9.82%