Kotlin:如何在委托属性中避免自动装箱(垃圾)?

8
在我的软件中,我使用属性委托来处理一些不同的值。
这是一个简单类似的示例,展示了我做的事情:
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)

然而,我注意到每次引用此值似乎会创建一个自动装箱对象(java.lang.Integer)。由于该值可能每秒被引用数百万次,这导致我的软件产生了大量垃圾,并对垃圾收集器造成了巨大压力。
有没有避免开销的方法?如果没有直接的方法,是否有任何聪明的方式来“模拟”属性委托并具有高性能?

enter image description here

我在 YouTrack 上提交了一个错误报告:https://youtrack.jetbrains.com/issue/KT-13606


3
你所发布的示例代码不应该产生任何装箱操作。我在字节码中没有看到任何对Integer.valueOf方法的调用。 - Alexander Udalov
1
在Java平台上,数字通常以JVM原始类型的形式进行物理存储,除非我们需要一个可空的数字引用(例如Int?)*或涉及泛型。在后一种情况下,数字将被装箱。- 我猜这就是问题所在... - Lovis
1
刚刚看到你在错误报告中也被告知了这个。 - Lovis
非常抱歉,我没有包含故事的那一部分!正如Dmitry Petrov所猜测的那样,我确实在使用泛型。已更新问题并使用了泛型。 - Jire
1
建议的解决方案是为原始值创建专门的委托类。 - RobCo
1个回答

4

如在错误报告中所讨论的,您的应用程序会生成垃圾,因为您的属性委托是通用的,因此需要对值进行装箱。如果您使用一个非泛型属性委托和一个原始类型,则不会发生装箱。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接