实例val是否比伴随对象val更昂贵?

时间:2016-07-04 06:34:03

标签: kotlin

有一个很好的理由(表现方面)来取代:

val SOME_CONST = "value"

companion object {
    val SOME_CONST = "value"
}

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

1 个答案:

答案 0 :(得分:12)

是的,val中存储的companion object效率更高。您可以使用Kotlin bytecode viewer找出编译到这些选项的内容。

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

  • 伴随对象val只存储一次,与实例val不同,后者实际存储在每个实例中,从而增加了实例内存占用量(String文字{{3}但是,实例将引用它)和实例创建时间(在构造期间,必须填写一个字段)。

  • 连续多次访问协同对象val在CPU缓存方面比在不同实例中使用val效果更好:它具有更好的is stored in constant pool。取消引用不同的实例来访问其中的val可能会导致CPU缓存未命中,这对性能不利。

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

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

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

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

相关问题