把一个Java应用程序转换为Kotlin,编译时间要多久? 这是关于Kotlin的一系列文章。分为三个部分。 第一部分讨论了从Java转换到Kotlin。第二部分是我对Kotlin的看法。 在前面的文章中, 我讨论了把Android 应用从Java 100%转换为Kotlin 。 Kotlin代码比Java的简洁,更易于维护,所以我认为转换是值得的。 但有些人不想试用Kotlin,因为他们担心它编译可能没有Java快。 这个关注点绝对是正确的,如果变得编译很慢,没有人愿意转换他们的代码。 所以,让我们编译Lock App试一下 ,然后我把它转换成Kotlin。 我不会试图比较一行代码的编译速度; 相反,我将尝试回答将代码从Java转换为Kotlin是否会影响其总体构建的时间。 我如何测试构建时间我写了一个shell来重复执行gradle。 所有测试连续进行10次。 该项目的每个场景之前clean,并使用Gradle daemon ,daemon之前停止一次。 测试我想在几种常见的使用场景中运行基准:使用和不使用Gradle daemon+clean,没有文件更改的增量编译,以及更改的文件的增量编译。 clean + 不用Gradle daemon Build这是两种语言中构建时间最差的情况:从冷启动运行一个clean的构建。 对于这个测试,我禁用了Gradle daemon。 ![]() 在这种情况下的结果是,Java构建时间平均为15.5秒,而Kotlin平均为18.5秒:增加了17%。 这对Kotlin来说并不是一个好的开始,但是大部分人不会这么编译他们的代码。
clean +Gradle daemon Build这个JIT编译器的问题 ,就像JVM中,是它们需要时间来编译对报告的执行的代码,等等的处理随时间增加的性能,因为它运行。 如果停止JVM进程,那么性能增益会丢失。 在构建Java代码时,通常在每次构建时启动和停止JVM。 这迫使JVM每次构建时重做工作。 为了解决这个问题,Gradle附带了一个守护进程,它将在构建之间保持活跃,以便保持JIT编译的性能提升。 你可以通过在gradle命令行加参数--daemon或者在gradle.properties文件添加一句org.gradle.daemon=true。 ![]() 可以看到,第一次运行所花费的时间与没有daemon的时间相同,但后续运行的性能提高,直到第四次运行。 在这种情况下,查看第三次运行后的平均构建时间更有用,其中daemon已工作过了。 对于热运行,在Java中执行clean构建的平均时间为14.1秒,而Kotlin以16.5秒的速度运行时间:多了13%。
Kotlin正在赶上Java,但仍然稍微落后。 但是,无论使用什么语言,Gradle daemon都会将构建时间减少40%以上。 如果你还没有使用它,你应该用上。 所以Kotlin编译在完整代码情况下比Java慢一点。 但是你通常只会对几个文件进行更改后编译,增量构建将有不同的性能。 所以,让我们来看看Kotlin在增量编译是否可以赶上。 增量构建编译器最重要的性能特性之一是使用增量编译。 正常构建将重新编译项目中的所有源文件,但是增量构建将跟踪自上次构建以来哪些文件已更改,并且只重新编译这些文件和依赖它们的文件。 这可能对编译时间有巨大的影响,特别是对于大型项目。 ![]() 接下来,我们将使用修改后的源文件测试增量编译。 为了测试这个,我在每次构建之前改变了一个java文件,Kotlin也一样。 在这个基准测试中,源文件是没有其他文件依赖的UI文件: 最后,让我们看看使用修改的源文件进行增量编译,其中文件导入到项目中的许多其他文件 ![]() 你可以看到Gradle daemon仍需要两三次运行来预热,但是之后两种语言的性能是非常相似的。 没有更改,Java每个热建立4.6秒,而Kotlin平均4.5秒。 当我们更改一个没有被任何其他文件使用的文件时,Java平均需要7.0秒来做一个热构建,Kotlin是6.1秒。 最后,当我们更改项目中许多其他文件导入的文件时,Java需要7.1秒才能在Gradle daemon加热后执行增量构建,而Kotlin平均6.0秒。
结论我们对几个不同的场景进行了基准测试,看看Kotlin在编译时间是否可以跟上Java。 虽然Java在clean构建比Kotlin
快10-15%,但这些情况很少。 对于大多数开发人员来说,更常见的情况是部分构建,其中增量编译进行了大量改进。 随着Gradle
daemon运行和增量编译的开启,Kotlin编译速度快或略快于Java。 英语原文:Kotlin vs Java Compilation Speed 编译:掘金 |