根据设计,样式在 Compose 的布局和绘制阶段运行。这样一来,就不需要创建基于 lambda 的修饰符,因为样式始终会跳过组合阶段。
与修饰符相比,性能提升主要得益于以下三项优化:
- 阶段转移:样式通常以 Draw 阶段为目标。当值发生更改时,Compose 只会使受影响的阶段(例如,重绘)失效,而不会触发完整的重组或重新布局。
- 延迟分配:样式会延迟动画资源分配,直到动画实际开始。这样可以减少初始撰写期间所需的工作量。
- 减少了对象开销:链式修饰符会为每个属性(例如内边距、边框)分配一个对象。样式使用单个 lambda 来应用多个属性,从而显著减少内存分配。如果某个样式是在主题中定义的,则该 lambda 会在所有使用相应主题的组件之间共享。
下表显示了 Compose 1.11.0-alpha06 的样式内部性能基准测试的示例结果,并与不使用样式的 Compose 实现进行了比较。
basic_box_border_change 测试突显了样式系统在避免属性更新期间分配多个修饰符对象方面的优势,从而使分配量大幅减少了约 77%,时间减少了约 59%。
测试方法 |
说明 |
时间变更 |
分配变更 |
切换 |
-59.91% |
-77.22% |
|
比较基于样式的悬停/焦点/按下状态与手动互动状态收集。 |
-5.24% |
-14.72% |
|
测量具有 5 个链式修饰符的 |
-4.78% |
-6.60% |
|
使用硬编码的字符串渲染五个 |
+0.62% |
+2.41% |
|
比较通过样式设置文字颜色与使用 |
+5.86% |
+9.82% |