关于应用Kotlin后的编译速度问题

4,777 阅读3分钟

2017年 Kotlin 被 Google 钦定为 Android 开发官方语言之一后,便如火如荼。很多团队开始应用了Kotlin,可谓是收益良多,可是也有一些问题,一个比较明显的就是Kotlin应用后编译速度会比较慢。这种感觉就像我们从Eclipse迁移到Android Studio变慢差不多。本文将尝试介绍一些方法来改善这一问题。

关于项目编译慢有很多原因,在Android项目中,通常会和Kotlin和Gradle有关系。首先我们通过一组图就能发现这其中的问题。其中

  • 红色代表Java,青色代表Kotlin
  • X轴代表编译次数数据,Y轴达标消耗的时间
  • Java的项目和Kotlin的项目实现功能一致,无其他额外差别

下图的测试为10次连续的未修改的编译,两个项目均没有启动Gradle daemon。可以看出Kotlin耗时确实要耗时多一些。

http://7jpolu.com1.z0.glb.clouddn.com/Ten_consecutive_clean_builds_without_the_Gradle_daemon.png

接下来我们尝试开启Gradle daemon,下图即为新的测试数据(连续10次开启gradle daemon编译)。

我们可以发现开启gradle daemon后,Java的编译耗时和Kotlin明显减少,但是总的来看,Kotlin还是要耗时一些。 http://7jpolu.com1.z0.glb.clouddn.com/TenconsecutivecleanbuildswiththeGradledaemonrunning.png

Kotlin在1.0.2后,增加了增量编译,那么我们看一下开启增量编译后的效果呢,如下图(启用增量编译后,连续10次没有文件变化的编译)

我们可以发现,除了第一次编译差距大一些的情况外(因为增量编译对第一次编译不起作用),后续的Java和Kotlin编译时间几乎一样,甚至Kotlin耗时更少。 http://7jpolu.com1.z0.glb.clouddn.com/TenXconsecutiveincrementalbuildswithnofileschanged.png

一个文件不修改的增量编译现实中很少,很多时候我们都会进行文件的修改。当我们尝试修改一个独立的文件,再次执行测试,看一看有什么效果,如下图。

真的不可思议,Kotlin耗时这下已经和Java拉开了更大的差距,表现的更加优秀。

http://7jpolu.com1.z0.glb.clouddn.com/TenYconsecutive_incrementalbuildswithoneisolatedfilechanged.png

然而项目中,我们的修改往往可能是针对一块核心的代码,很多的地方都调用它,当我们在尝试修改一个核心代码,连续10次进行测试(kotlin开启增量编译),数据又是如何呢?

如下图所示,Kotlin表现依然优秀于Java。

http://7jpolu.com1.z0.glb.clouddn.com/Tenconsecutiveincrementalbuildswithonecorefilechanged.png

通过上面的图例说明,我们发现其实Kotlin在某些情况下编译并不慢。同样我们也发现了一些加速Kotlin编译的方法,即

  • 开启gradle daemon,即在~/.gradle/gradle.properties文件中,增加org.gradle.daemon=true
  • 在项目的gradle.properties中增加kotlin.incremental=true 开启kotlin的增量编译。
  • 尝试使用最新的kotlin版本,增加编译速度是Kotlin团队一直努力的目标
  • 更多的加速编译的方法,请参考一些关于加速Gradle构建的个人经验

引用资料