Kotlin:避免创建 FqNameUnsafe 和 FqName
Kotlin: Avoid creating FqNameUnsafe and FqName
我注意到我的应用程序创建了大量 FqNameUnsafe
和 FqName
实例。这些是什么时候创建的?我怎样才能避免创建这些? (我需要减少应用程序中的垃圾创建。)
我的 Kotlin 项目中没有 FqNameUnsafe 或 FqName。它仅包含在 kotlin-reflect (a separate JAR file).
中
如果您不必在应用程序中使用 kotlin-reflect,则不要将其包含在类路径中。一般来说,Kotlin 编译成非常直接的 JVM 字节码,不会产生太多开销(如果有的话),有时性能优于普通 Java 因为它可以 inline functions (you can search for "overhead" in the Kotlin Language Documentation 了解更多细节)。
但是,如果您确实需要使用 kotlin-reflect,那么据我所知,没有任何选项可以调整它的工作方式,您将招致 costs typical to reflection(加上任何特定于 Kotlin 反射的东西为此我找不到任何有用的文档)。
更新 (2016-09-13):问题已经 fixed 并且不会从 Kotlin 1.1 开始重现。
我想如果您不经常调用 KClass#qualifiedName
或缓存其结果,情况可能会好一些。这个 属性(以及其他使用限定名称的)的当前实现并没有像它应该的那样优化。事实上,目前我们并没有关注反射实现的性能,但 Kotlin 1.0 之后可能会有所改善。
同时,如果您想跟踪其状态,请在 youtrack.jetbrains.com 报告此问题(以及您会发现的任何其他问题)。谢谢!
我注意到我的应用程序创建了大量 FqNameUnsafe
和 FqName
实例。这些是什么时候创建的?我怎样才能避免创建这些? (我需要减少应用程序中的垃圾创建。)
我的 Kotlin 项目中没有 FqNameUnsafe 或 FqName。它仅包含在 kotlin-reflect (a separate JAR file).
中如果您不必在应用程序中使用 kotlin-reflect,则不要将其包含在类路径中。一般来说,Kotlin 编译成非常直接的 JVM 字节码,不会产生太多开销(如果有的话),有时性能优于普通 Java 因为它可以 inline functions (you can search for "overhead" in the Kotlin Language Documentation 了解更多细节)。
但是,如果您确实需要使用 kotlin-reflect,那么据我所知,没有任何选项可以调整它的工作方式,您将招致 costs typical to reflection(加上任何特定于 Kotlin 反射的东西为此我找不到任何有用的文档)。
更新 (2016-09-13):问题已经 fixed 并且不会从 Kotlin 1.1 开始重现。
我想如果您不经常调用 KClass#qualifiedName
或缓存其结果,情况可能会好一些。这个 属性(以及其他使用限定名称的)的当前实现并没有像它应该的那样优化。事实上,目前我们并没有关注反射实现的性能,但 Kotlin 1.0 之后可能会有所改善。
同时,如果您想跟踪其状态,请在 youtrack.jetbrains.com 报告此问题(以及您会发现的任何其他问题)。谢谢!