2016-08-25 88 views
8

W moim oprogramowaniu mam różne wartości, które korzystają z delegowania właściwości.Kotlin: Jak mogę uniknąć autoboxing (śmieci) w delegowanych właściwościach?

Jest to prosty podobny przykład pokazujący, co robię:

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) 

Co Zauważyłem jednak, że odnosząc się do tej wartości wydaje się stworzenie autoboxed obiekt (java.lang.Integer) na KAŻDY referencyjnej . Ponieważ wartość musi odnosić się potencjalnie do milionów lub razy na sekundę, powoduje to masowe tworzenie śmieci dla mojego oprogramowania; ciężki stres kładzie się na pojemniku na śmieci.

Czy istnieje sposób na uniknięcie nadmiernego obciążenia? Jeśli nie bezpośrednio, czy istnieją sprytne sposoby na "emulację" delegowania własności, które są wydajne?

enter image description here

przedłożył raport o błędzie na YouTrack: https://youtrack.jetbrains.com/issue/KT-13606

+3

Zamieszczony przykładowy kod nie powinien generować żadnego boksu. Nie widzę żadnych połączeń z 'Integer.valueOf' w bajtode. –

+1

"Na platformie Java liczby są fizycznie przechowywane jako typy podstawowe JVM, chyba że potrzebujemy odnośnika liczbowego z wartością zerową (np. Int?) * Lub generycznych *. W tych ostatnich przypadkach numery są oznaczone ramkami." - Domyślam się, że to jest problem tutaj ... – Lovis

+1

właśnie zobaczyłem, że to jest to, co usłyszałeś na swoim raporcie o błędzie – Lovis

Odpowiedz

4

Jak omówiono w bug report, aplikacja generuje śmieci, ponieważ delegat nieruchomość jest ogólna, a zatem wymaga boks wartości. Jeśli użyjesz niegenerycznego delegata właściwości z typem pierwotnym, boks się nie stanie.