是否有一个很好的理由(性能方面)来替换:
val SOME_CONST = "value"
同
companion object {
val SOME_CONST = "value"
}
Run Code Online (Sandbox Code Playgroud)
添加@JvmStatic注释会改变结果吗?
hot*_*key 12
是的,val存储companion object更有效.您可以使用Kotlin字节码查看器来查找这些选项的编译内容.
以下是我注意到可能会影响性能的事情:
伴随对象val只存储一次,与实例不同val,实际存储在每个实例中,从而增加实例内存占用(String文字存储在常量池中,但实例将引用它)和实例创建时间(在构造期间,必须填写一个字段).
val连续多次访问伴随对象在CPU缓存方面比val在不同实例中使用更好:它具有更好的引用局部性.取消引用不同的实例来访问val它们可能会导致CPU缓存未命中,这对性能不利.
但是,如果val仅在同一类的实例方法中使用,则所描述的效果几乎不会影响性能,因为this无论如何这些方法都可能取消引用,这甚至可以更好地工作,在访问伴随对象时不会导致可能的高速缓存未命中.
添加@JvmStatic使访问速度更快一些.没有它,访问该值需要获取静态Companion引用并调用getSOME_CONST()它.有了@JvmStatic,会有静态方法getSOME_CONST()(跳过Companion).还有@JvmField一个公共字段可以直接访问,甚至无需调用getter.
但JIT编译器可能会优化前两种情况的getter访问,因此注释的效果几乎不会引起注意.
此外,除了性能之外,实例val具有可能对每个实例都不同的值的语义,因此companion object似乎更适合全局常量值的情况.
| 归档时间: |
|
| 查看次数: |
210 次 |
| 最近记录: |