Kotlin: избегайте создания FqNameUnsafe и FqName

Я заметил, что мое приложение создает огромное количество экземпляров FqNameUnsafe и FqName. Когда они созданы? Как я могу избежать их создания? (Мне нужно уменьшить создание мусора в моем приложении.)

введите здесь описание изображения


person Jire    schedule 03.12.2015    source источник


Ответы (2)


У меня нет FqNameUnsafe или FqName в моих проектах Kotlin. Он включен только в kotlin-reflect (отдельный файл JAR).

Если вам не нужно использовать kotlin-reflect в своем приложении, не включайте его в путь к классам. В общем, Kotlin компилируется в довольно простой байт-код JVM и не создает больших накладных расходов, если таковые имеются, а иногда превосходит обычную Java, потому что может встроенные функции (вы можете искать "overhead" в Документацию по языку Kotlin для более подробной информации).

Однако, если вам нужно использовать kotlin-reflect, то, насколько я могу судить, нет никаких вариантов настройки того, как он работает, и вы понесете затраты, типичные для отражения (плюс что-то конкретное для отражения Kotlin, по которому я не смог найти никакой полезной документации).

person mfulton26    schedule 03.12.2015

ОБНОВЛЕНИЕ (13 сентября 2016 г.): проблема была исправлена и больше не будет быть воспроизводимым, начиная с Kotlin 1.1.

Я предполагаю, что это может стать немного лучше, если вы будете вызывать KClass#qualifiedName реже или кешировать его результаты. Текущая реализация этого свойства (и других, работающих с полными именами) далеко не так оптимизирована, как должна быть. На самом деле, в настоящее время мы не уделяем внимания производительности при реализации отражения, но, вероятно, после Kotlin 1.0 она будет улучшена.

Тем временем сообщите об этой проблеме (и любых других, которые вы найдете) на youtrack.jetbrains.com, если вы хотите отслеживать его статус. Благодарю вас!

person Alexander Udalov    schedule 07.12.2015
comment
Спасибо тебе за это. Таким образом, корень моей проблемы в том, что у меня проблемы с кэшированием результатов, потому что я разрешаю овеществленный универсальный тип. Тип, который я извлек, не работает так, как я ожидал, поэтому я использовал qualifiedName в качестве пластыря. Вы изначально дали ответ на другой вопрос, но сначала он был очень неясен. С тех пор я обновил вопрос и жду ответа на него, если вы все еще заинтересованы: stackoverflow.com/questions/33980151/ еще раз спасибо. - person Jire; 08.12.2015