【发布时间】:2015-10-21 18:33:57
【问题描述】:
我正在考虑将 Kotlin 用于模拟框架,并注意到编译器会在每个可以从 java 访问的方法之后交织静态 checkParameterIsNotNull 调用。这通过每次运行此方法时访问(和转储?)调用堆栈来检查方法参数是否不为空。现在,在典型的模拟框架中,运行次数可能达到数百万,我想知道这种功能对性能的影响。
如果有关闭它的选项?
【问题讨论】:
标签: performance simulation kotlin
我正在考虑将 Kotlin 用于模拟框架,并注意到编译器会在每个可以从 java 访问的方法之后交织静态 checkParameterIsNotNull 调用。这通过每次运行此方法时访问(和转储?)调用堆栈来检查方法参数是否不为空。现在,在典型的模拟框架中,运行次数可能达到数百万,我想知道这种功能对性能的影响。
如果有关闭它的选项?
【问题讨论】:
标签: performance simulation kotlin
首先,每次运行方法时都不会访问和转储调用堆栈。在正常执行期间,只执行一次空检查,这没有任何明显的开销。只有当参数为空且需要抛出异常时才访问调用堆栈。
不会为私有方法生成断言(因为它们不能从 Java 代码中调用,并且 Kotlin 编译器会确保调用该方法的 Kotlin 代码不会传递任何空值)。因此,完全避免开销的最佳方法是使用私有方法编写模拟代码的内部循环。
您可以使用命令行编译器的-Xno-param-assertions 和-Xno-call-assertions 选项禁用断言生成。请注意,这些选项不受支持,将来可能会被删除。
【讨论】: