Kotlin VS Java:编译速度大比拼,到底谁更快?

达尔文
 达尔文
发布于 2016年12月03日
收藏 20

把一个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之前停止一次。
本文中的所有测试都在运行于3.4 GHz的Intel Core i7-6700上,使用32GB的DDR4内存和三星850 Pro SSD。 源代码是用Gradle 2.14.1构建的。

测试

我想在几种常见的使用场景中运行基准:使用和不使用Gradle daemon+clean,没有文件更改的增量编译,以及更改的文件的增量编译。
在转换之前,App Lock的Java代码有5,491个方法和12,371行代码。 改写后,这些数字下降到4,987方法和8,564行Kotlin代码。 在重写期间没有发生大的架构更改,因此在重写之前和之后测试编译时间应该很好地了解Java和Kotlin之间的构建时间的差异。

clean + 不用Gradle daemon Build

这是两种语言中构建时间最差的情况:从冷启动运行一个clean的构建。 对于这个测试,我禁用了Gradle daemon。
这里是十个构建所花费的时间:

在这种情况下的结果是,Java构建时间平均为15.5秒,而Kotlin平均为18.5秒:增加了17%。 这对Kotlin来说并不是一个好的开始,但是大部分人不会这么编译他们的代码。

对于没有Gradle daemon 并且clean构建,Java编译比Kotlin快17%

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%。

对于clean + Gralde daemon 编译,Java编译比Kotlin快13%。

Kotlin正在赶上Java,但仍然稍微落后。 但是,无论使用什么语言,Gradle daemon都会将构建时间减少40%以上。 如果你还没有使用它,你应该用上。

所以Kotlin编译在完整代码情况下比Java慢一点。 但是你通常只会对几个文件进行更改后编译,增量构建将有不同的性能。 所以,让我们来看看Kotlin在增量编译是否可以赶上。

增量构建

编译器最重要的性能特性之一是使用增量编译。 正常构建将重新编译项目中的所有源文件,但是增量构建将跟踪自上次构建以来哪些文件已更改,并且只重新编译这些文件和依赖它们的文件。 这可能对编译时间有巨大的影响,特别是对于大型项目。
增量构建在kotlin1.0.2以后版本支持 ,你可以在你的gradle.properties文件添加kotlin.incremental = true实现。
那么当使用增量编译时,Kotlin与Java的编译时相比如何? 以下是没有更改文件时使用增量编译的基准:

接下来,我们将使用修改后的源文件测试增量编译。 为了测试这个,我在每次构建之前改变了一个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。

结论

我们对几个不同的场景进行了基准测试,看看Kotlin在编译时间是否可以跟上Java。 虽然Java在clean构建比Kotlin 快10-15%,但这些情况很少。 对于大多数开发人员来说,更常见的情况是部分构建,其中增量编译进行了大量改进。 随着Gradle daemon运行和增量编译的开启,Kotlin编译速度快或略快于Java。
这是一个我完全没有想到并且令人印象深刻的结果。 我必须赞扬Kotlin团队设计一种不仅具有很多优秀功能,而且能够快速编译的语言。
如果你因为编译时试图使用Kotlin,你不必担心:Kotlin的编译速度和Java一样快。

英语原文:Kotlin vs Java Compilation Speed

编译:掘金

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:Kotlin VS Java:编译速度大比拼,到底谁更快?
加载中

精彩评论

天天笑笑
天天笑笑

引用来自“卖萌的程序猿”的评论

java没什么好,但是也没什么不好,

引用来自“eechen”的评论

Java没有PHP简单/实用/稳定,也没有PHP学习/开发/成本低,而且Java就是复杂就是绕,跟就是简单就是快的PHP形成鲜明的对比.

运行在虚拟机上,内存占用和CPU占用都比C/C++多,而且又没有PHP/JS这类动态脚本语言灵活,这些都是Java的不好之处.

所以请别再说Java没什么不好了,Java不配.

引用来自“天天笑笑”的评论

你这拿短处比长处有意思吗?从安卓开发、到企业级运用、再到分布式计算,为什么不选择c++和php,你觉得这些决策者都比你脑残吗

引用来自“eechen”的评论

所以Android上出现了用HTML/JS开发基于WebView的Cordova混合应用开发方式呀.
谁跟你说企业级应用(ERP/CRM/OA等)不能用PHP?
这些东西在基于客户端的年代用VB和Delphi开发的都大把.
在基于浏览器的年代用HTML+PHP开发也容易得很.
还有谁跟你说分布式计算就一定要用Java?
Google引以为傲不开源的三个平台GFS/MapReduce/BigTable就不是基于Java开发而是基于C/C++开发.
使用Snappy压缩算法的开源K/V存储引擎LevelDB是Google BigTable的一部分,用的是C/C++.
百度开源的海量数据库Tera和分布式文件系统BFS用的也不是Java,同样是C/C++.
阿里开源的OceanBase/TaobaoFS也一样不是Java.
所以,别再吹嘘Java怎么怎么不可或缺了.
多种混合开发模式那不是很正常吗?举的这些百分之一的例子没有任何说服力。可怜你那万能的php连百分一的例子都没有,除了搞搞网页(其他语言都能搞定的东西),还能干啥? Andriod、Hadoop、Cassandra、Hive、HBase、Kylin、 ElasticSearch、Lucene、ActiveMQ,JStorm、Flume、Tomcat、Jetty、Eclipse、Netbean、IDEA、还有java衍生的的Kafka、Spark ,还有IBM ORACLE 很多商用的东西,哪一个不是大名鼎鼎,你倒是用php来搞一个啊
卖萌的程序猿
卖萌的程序猿
java没什么好,但是也没什么不好,
就是个精虫上脑的地方
就是个精虫上脑的地方
我勒个去 java自家兄弟比比编译快慢 PHP滚进来是几个意思? 你也找个自家兄弟去比啊 kotlin已经在项目里用了 我表示很爽 现在都搞移动端了 天天还叫嚣的我做网页最快 我是HTML的爹 有用吗?
bovver
bovver

引用来自“卖萌的程序猿”的评论

java没什么好,但是也没什么不好,

引用来自“eechen”的评论

Java没有PHP简单/实用/稳定,也没有PHP学习/开发/成本低,而且Java就是复杂就是绕,跟就是简单就是快的PHP形成鲜明的对比.

运行在虚拟机上,内存占用和CPU占用都比C/C++多,而且又没有PHP/JS这类动态脚本语言灵活,这些都是Java的不好之处.

所以请别再说Java没什么不好了,Java不配.
这个比较就如同一些没有能力的人站在真正做事情的人背后指手画脚一样,如果php那么牛逼,为什么php推出的时间和java相差并不大,但是目前世界上的各大网站系统均采用java构建,而不是那么完美的php呢。这么多年了php也仅仅只适用于中小型网站和一些大型网站的前端模块呢。而java那么多不完美的地方人们为什么仍然要选择java呢,只能说明php在某些方面连你瞧不上的java都不如,但你却把它当宝贝一样。
在我看来过去这么多年php还是有它存在的价值的,只是小型网站和部分大型网站的前端模块可以考虑用php来实现,它确实可以起到快速发布的作用。但是随着近几年前端框架的迅猛发展,很多人已经不再倾向于用后台技术渲染界面,而是采用目前比较流行的前端框架来实现,后台仅需要提供数据接口,如此一来像php这样的所谓网页预处理的语言将不再有存在必要和价值,肯定会逐步沦为小众甚至无人问津。
蓝风970655147
蓝风970655147
哈哈哈 原来php是世界上最好的语言是这么来的啊

最新评论(54

RippleChan
RippleChan
php的安全性相当糟糕,别说什么相对以前的话。
蓝风970655147
蓝风970655147
哈哈哈 原来php是世界上最好的语言是这么来的啊
猴子加加

引用来自“卖萌的程序猿”的评论

java没什么好,但是也没什么不好,

引用来自“eechen”的评论

Java没有PHP简单/实用/稳定,也没有PHP学习/开发/成本低,而且Java就是复杂就是绕,跟就是简单就是快的PHP形成鲜明的对比.

运行在虚拟机上,内存占用和CPU占用都比C/C++多,而且又没有PHP/JS这类动态脚本语言灵活,这些都是Java的不好之处.

所以请别再说Java没什么不好了,Java不配.

引用来自“天天笑笑”的评论

你这拿短处比长处有意思吗?从安卓开发、到企业级运用、再到分布式计算,为什么不选择c++和php,你觉得这些决策者都比你脑残吗

引用来自“eechen”的评论

所以Android上出现了用HTML/JS开发基于WebView的Cordova混合应用开发方式呀.
谁跟你说企业级应用(ERP/CRM/OA等)不能用PHP?
这些东西在基于客户端的年代用VB和Delphi开发的都大把.
在基于浏览器的年代用HTML+PHP开发也容易得很.
还有谁跟你说分布式计算就一定要用Java?
Google引以为傲不开源的三个平台GFS/MapReduce/BigTable就不是基于Java开发而是基于C/C++开发.
使用Snappy压缩算法的开源K/V存储引擎LevelDB是Google BigTable的一部分,用的是C/C++.
百度开源的海量数据库Tera和分布式文件系统BFS用的也不是Java,同样是C/C++.
阿里开源的OceanBase/TaobaoFS也一样不是Java.
所以,别再吹嘘Java怎么怎么不可或缺了.

引用来自“天天笑笑”的评论

多种混合开发模式那不是很正常吗?举的这些百分之一的例子没有任何说服力。可怜你那万能的php连百分一的例子都没有,除了搞搞网页(其他语言都能搞定的东西),还能干啥? Andriod、Hadoop、Cassandra、Hive、HBase、Kylin、 ElasticSearch、Lucene、ActiveMQ,JStorm、Flume、Tomcat、Jetty、Eclipse、Netbean、IDEA、还有java衍生的的Kafka、Spark ,还有IBM ORACLE 很多商用的东西,哪一个不是大名鼎鼎,你倒是用php来搞一个啊
PHP=拍黄片,简单,快速,收益高,但是拍不大啊,Java=商业大片,就算不出彩,至少也能值回票钱,但是一般没有什么特别的内涵,获不了什么有分量的奖项,C/C++=文艺片,无数的烂片,总能有闪光的经典,获奖的也多是这样的东东.其他的,可以参考以上.
s
sorra
全量编译明显比Java慢多了,不只15%。
雷兽
php连作为一个完整语言的资格都没 谈个头?搞笑
Per_O
Per_O
评论真好看。JAVA的文章,扯到PHP了,有时候啊,看评论比文章有意思😂😂😂😂
水山清风
水山清风

引用来自“水山清风”的评论

scala 用户看到标题滚进来围观...

引用来自“Y292450104”的评论

scala 什么时候能把编译速度也提上来啊,太慢了
等 dotty,dotty 也不行就认命吧
如梦技术
如梦技术
官网看了一眼感觉很棒!值得一试!
w
wildq-qy
我也受不了了,真特么当php是世界最好的语言呐?海燕呐,长点心吧!!!
返回顶部
顶部