2016-08-25 69 views
8

私のソフトウェアでは、プロパティの委任を使用するさまざまな値があります。Kotlin:デリゲートされたプロパティでオートボックス(ゴミ)を避けるにはどうすればいいですか?

これは私が何をすべきかを示す簡単な同様の例である:私が気づいた何

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) 

は、しかし、この値を参照すると、autoboxedオブジェクト(java.lang.Integer)を作成するように見えるということですにEVERY参照。値は潜在的に毎秒何百回も何回も参照されなければならないので、私のソフトウェアのために大量のガーベジが作成されます。重いストレスがガベージコレクタに置かれます。

オーバーヘッドを避ける方法はありますか?直接ではない場合は、実行中のプロパティ代理を "エミュレート"する巧妙な方法がありますか? bug reportで説明したようにあなたの財産委譲が一般的であり、したがって値のボクシングを必要とするため、あなたのアプリがゴミを生成https://youtrack.jetbrains.com/issue/KT-13606

+3

投稿したコードの例ではボクシングが発生しません。バイトコードに 'Integer.valueOf'への呼び出しがありません。 –

+1

"Javaプラットフォームでは、ヌル値の参照(例:Int?)*やジェネリックが必要な場合を除いて、数値は物理的にJVMプリミティブ型として格納されます*。 - これがここの問題だと思います... – Lovis

+1

あなたのバグ報告にもあなたが言われていることがわかりました – Lovis

答えて

4

:YouTrack上のバグレポートを提出

enter image description here

。プリミティブ型の非ジェネリックプロパティデリゲートを使用すると、ボクシングは発生しません。

関連する問題