我经常在http://slack.kotlinlang.org/上看到开发人员,想知道他们的哪些代码片段性能更高。 通常,其中一个片段类似于Java中的处理方式,而另一个则是Kotlin惯用的方式。 通常,一种假设是,通过添加语法糖,“ Kotlin方式”比更冗长的“ Java方式”要慢。 并非总是如此。
具有Java开发背景,每当我负责基准测试代码块/方法的性能时,我都会自动考虑这样做:
您不得不用Java写类似的东西多少次,认为必须有更好的方法?
更好的方法终于来了,同样,它来自科特林。
更直观,更简洁的代码,没有数学(尽管很基础)都意味着编写代码时出错的机会更少。
注意, measureTimeMillis (以及measureNanoTime )是标准的库函数。 在Kotlin中,当函数将lambda作为最后一个参数时,可以在函数调用后提供lambda,如下所示:
measureTimeMillis() {}
并且由于没有其他参数传递给函数,因此可以完全省略括号:
measureTimeMillis {}
让我们来看一个示例用法。 当处理整数时,我们将比较基本的for循环和Kotlin标准库中的forEach函数之间的性能:
当我都运行时,我为forLoopMillisElapsed和forEachMillisEllapsed分别打印了3毫秒和15毫秒 分别。 因此,我着手弄清楚性能差异的原因可能是什么。
IntelliJ IDEA使您可以使用“ 工具”>“ Kotlin”>“显示Kotlin字节码”>“反编译”轻松地将Kotlin代码反编译为Java。 让我们反编译上面的两个代码块并研究结果:
反编译了for循环的代码段包含:
反编译了forEach循环的代码段包含:
因此,可以得出这样的逻辑,即在这种特殊情况下,forEach函数比常规的for循环慢,这是由于在数组上进行迭代时分配Iterator和Iterable对象的开销。
因为使用Kotlin进行基本的代码性能测量非常容易,所以我期望使用measureTimeMillis 在我的代码中,相当向前。 这与研究反编译的Kotlin字节码一起,是了解Kotlin如何与JVM交互的好方法。 生成的代码是否总是最优的? 不一定—在代码性能,清晰度和简洁性之间总要权衡取舍。 但这是另一篇文章的主题。
From: https://hackernoon.com/basics-of-measuring-performance-in-kotlin-e1dec6c0fa95