You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose:普通值与remember的效率对比及用法疑问

Jetpack Compose 不可变共享值的赋值与性能分析

核心结论

  • 编译期确定的不可变值,直接定义为顶层/伴生对象常量效率最高;
  • 运行期确定但不会变化的不可变值,用remember缓存可避免重组时重复计算;
  • 你对两种方案的判断正确,方案2(remember)性能优于方案1。

两种方案的具体分析

假设你的两种方案如下:

方案1:重组时重复赋值

@Composable
fun ExampleScreen() {
    val example = 5.dp // 每次重组都会重新生成该Dp实例
    ChildComposable1(example)
    ChildComposable2(example)
}
  • 问题:每次Composable重组,5.dp都会被重新计算。虽然Dp是轻量值类型,单次计算成本极低,但高频重组场景下仍会累计微小开销;若换成复杂计算(比如资源文件解析转换),重复计算的成本会被放大。

方案2:用remember缓存

@Composable
fun ExampleScreen() {
    val example = remember { 5.dp } // 仅首次组合时赋值,后续重组直接复用缓存值
    ChildComposable1(example)
    ChildComposable2(example)
}
  • 优势:remember将值存储在Composable的状态容器中,仅在首次组合或传入的key变化时重新计算,后续重组直接复用缓存结果,彻底避免重复计算。

更优的替代方案

如果该不可变值是全局共享、且编译期就能确定的,直接定义为顶层常量或类的伴生对象常量,性能比remember更优:

// 顶层常量
val EXAMPLE_DP = 5.dp

@Composable
fun ExampleScreen() {
    ChildComposable1(EXAMPLE_DP)
    ChildComposable2(EXAMPLE_DP)
}
  • 原因:常量在编译期就已确定,运行时无需任何计算或缓存操作,直接复用,是性能最高的实现方式。

remember的性能提升场景

remember的性能价值主要体现在:

  • 计算成本较高的不可变值(比如复杂尺寸计算、多字符串拼接、资源解析等);
  • 运行期确定但后续不会变化的值(比如从ViewModel获取的初始化配置);
  • 对于5.dp这类极低成本的计算,remember的性能提升微乎其微,但从代码规范角度,用常量或remember都能避免不必要的重复计算。

内容的提问来源于stack exchange,提问作者Tunahan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:45:59