gpt4 book ai didi

kotlin - 实例 val 是否比伴生对象 val 更 coSTLy?

转载 作者:IT老高 更新时间:2023-10-28 13:41:31 24 4
gpt4 key购买 nike

是否有充分的理由(在性能方面)替换 a:

val SOME_CONST = "value"

companion object {
val SOME_CONST = "value"
}

添加 @JvmStatic 注释会改变结果吗?

最佳答案

是的,val 存储在 companion object 中更有效。您可以使用Kotlin bytecode viewer找出这些选项被编译成什么。

以下是我注意到的可能会影响性能的事情:

  • Companion object val 只存储一次,不像实例 val,它实际上存储在每个实例中,因此增加了实例的内存占用(String 字面量 is stored in constant pool ,但实例会有对它的引用)和实例创建时间(在构造过程中,必须填写一个字段)。

  • 连续多次访问伴随对象 val 与 CPU 缓存相比在不同情况下使用 val 效果更好:它有更好的 locality of reference .取消引用不同的实例以访问其中的 val 可能会导致 CPU 缓存未命中,这对性能不利。

    但是,如果 val 仅在同一类的实例方法中使用,所描述的效果几乎不会影响性能,因为这些方法可能会取消引用 this,并且这甚至可以更好地工作,在访问伴随对象时不会导致可能的缓存未命中。

  • 添加 @JvmStatic使访问速度更快一些。没有它,访问该值需要获取静态 Companion 引用并在其上调用 getSOME_CONST()。使用@JvmStatic,会有静态方法getSOME_CONST()(跳过Companion)。还有@JvmField这使得公共(public)字段可以直接访问,甚至无需调用 getter。

    但 JIT 编译器可能会优化前两种情况的 getter 访问,因此注释的效果几乎不会被注意到。

此外,除了性能之外,实例 val 具有值的语义,每个实例可能不同,因此 companion object 似乎适合全局常量值的情况更好。

关于kotlin - 实例 val 是否比伴生对象 val 更 coSTLy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38178188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com