Kotlin:如何避免委托属性中的自动装箱(垃圾)?
Kotlin: How can I avoid autoboxing (garbage) in delegated properties?
在我的软件中,我有一些使用 属性 委托的不同值。
这是一个简单的类似示例,展示了我所做的事情:
class ExampleDelegate<T>(val value: T) {
operator fun getValue(thisRef: Any?, property: KProperty<*>) = value
}
val example by ExampleDelegate(1000) // number larger than 127 (no box cache)
但是,我注意到,引用此值似乎会在 EVERY 引用上创建一个自动装箱的对象 (java.lang.Integer
)。因为该值必须每秒可能被引用数百万次或数次,所以这会导致我的软件产生大量垃圾;垃圾收集器压力很大。
有没有办法避免开销?如果不是直接的,是否有任何巧妙的方法来 "emulate" 属性 高效委派?
提交了关于 YouTrack 的错误报告:https://youtrack.jetbrains.com/issue/KT-13606
如 bug report 中所述,您的应用会产生垃圾,因为您的 属性 委托是通用的,因此需要对值进行装箱。如果您使用原始类型的非泛型 属性 委托,则不会发生装箱。
在我的软件中,我有一些使用 属性 委托的不同值。
这是一个简单的类似示例,展示了我所做的事情:
class ExampleDelegate<T>(val value: T) {
operator fun getValue(thisRef: Any?, property: KProperty<*>) = value
}
val example by ExampleDelegate(1000) // number larger than 127 (no box cache)
但是,我注意到,引用此值似乎会在 EVERY 引用上创建一个自动装箱的对象 (java.lang.Integer
)。因为该值必须每秒可能被引用数百万次或数次,所以这会导致我的软件产生大量垃圾;垃圾收集器压力很大。
有没有办法避免开销?如果不是直接的,是否有任何巧妙的方法来 "emulate" 属性 高效委派?
提交了关于 YouTrack 的错误报告:https://youtrack.jetbrains.com/issue/KT-13606
如 bug report 中所述,您的应用会产生垃圾,因为您的 属性 委托是通用的,因此需要对值进行装箱。如果您使用原始类型的非泛型 属性 委托,则不会发生装箱。