河南梦之网网络科技有限公司
梦之网科技出品
扫描关注梦之网科技微信公众账号

扫小程序码联系客服

Java与Kotlin系列文章之性能问题详解-梦之网科技

梦之网科技2019-09-29文章动态

随着对 Kotlin 越来越深入的了解,我发现市面上关于 Kotlin 方面,比较深入的资料几乎是 0,所以我决定,将 Kotlin 各个方面的研究作为我的研究生课题,而性能问题往往是程序员最佳关注的内容,所以第一篇,我决定先对比一下 Java 和 Kotlin 之间的性能,通过著名的计算机语言的基准测试游戏来对两者的性能做一个全方位的对比。

大约一年前,我还是一名 Poznań 大学的大学生,学习软件工程相关的内容,考虑硕士论文相关的内容。几乎所有推荐学习的内容都超级无聊,我对它们提不起任何的兴趣,所以决定自己做一些研究课题。

与此同时,10 月份,我和 RSQ 技术组织的朋友一起前往阿姆斯特丹参加 KotlinConf 2018 的技术峰会。与来自 Kotlin 社区的很多有趣的朋友,一起参加了这场封闭式的座谈会。这其中就有德克斯大学的教授 Wiliam Cook,他在会中提到,Kotlin 在科学界没有太多的读者,关于 Kotlin 相关的论文也不多。这个时候我内心默默地问自己——是不是可以做点什么,试着写一些与 Kotlin 相关的内容?

会议结束的几天之后,我在家里听着旧的 KotlinConf 演讲内容,发现了 Duncan McGregor 提出的,关于缩短 Kotlin 代码大小和缩短执行时间的演讲。他点醒了我,让我更加深入地研究性能相关的问题,并开始在 Java 和 Kotlin 之间进行对比。

几个月后的现在,我作为一名研究生,在这里试图通过 Medium 平台的这篇文章,来展示我的研究成果,希望你能喜欢并能从中获益。

研究问题

在文章开始之前,我想说我的研究生论文中,研究的主要有两个问题,但是在这篇文章里面,我先介绍其中的一个——性能相关的问题。

问题:在相同的基准测试内容下,不同的 Java 运行时环境(JRE)对于性能会有显著的差异么?

计算机语言的基准测试游戏动态度量指标,是出自于目前比较流行的跨语言基准测试套件之一—— 计算机语言基准测试游戏(CLBG)的思路。

由 Doug Bagley 在 2000 年推出的,致力于对比所有编程语言的计算机项目。直至今天,该项目已经成为了计算机语言的基准测试的一个游戏,也是科学界比较流行的跨语言基准测试。随着新的基准测试诞生以及语言实现的增长而不断成长。创建者会系统地进行更新和整理,来达到跟踪市场趋势的目的(添加新的语言,删除不再使用的语言,并更新要测试的基准测试算法列表)。GLBG 基准测试背后,有一个目标,它的内容与下面这个,来自 4chan 平台用户提出的问题的答案基本一致:

我的问题是,如果在座有人有过简单的基准测试的经验,能告诉我应该测试哪些内容,以便对每种语言的总体性能有一个简单的了解吗?

为了回答这个问题,GLBG 团队提出了 10 种不同的算法问题。所有的问题以及相关的细节都可以在官网上看到。对于如何实现这些算法也有较为严苛的标准,算法最后的结果用什么去对比也是一个问题。这些信息确定之后,相关的问题就可以用指定的语言去实现,然后进行判断。

为了能够客观的评价结果,CLBG 基准测试组使用固定的脚本内容,对待所有的实验统一实现的指标。对于所有指定的语言,实现算法使用的测试值都是独立的。

基准程序的选择

随着实现内容的不断开发,计算机语言基准测试游戏目前由 10 个基准程序组成(备注:这个数字随着时间也会不断增加)。每一个都提供了一个完全不同的问题,针对这个问题,使用不同的语言规范、语言特性和方法,试图使用最通用的方式来解决它们。(我不打算介绍 CLGB 每一个基准的内容,如果你有兴趣的话,可以到他们的官网查询相关的细节)

我们实验的主要目的还是比较 Java 和 Kotlin,为了达到这一点,我们选用一个取自 CLBG 基准库里面的、由 Java 实现的程序。然后使用 Kotlin 实现两个版本 —— 一个是单纯的转换版本,另一个是针对问题使用 Kotlin 的惯用版本。(在下一节会详细介绍)

基于这些假设,我们根据两个因素来选择实验中使用的基准:

从 CLBG 存储库中获得的最合适的 Java 程序必须可转换为 Kotlin 语言。

程序必须对尽可能多的数据进行操作。

《JVM 托管语言:是否真的说到做到》的论文作者提出了一种区分 CLBG 程序库的区分方法,主要的判断条件是,程序主要操作的是整数、浮点数、指针还是字符串来区分。这些信息有助于我们将基准进行分组。

考虑到以上全部的因素,只有 6 个 GLBG 的基准测试是可行的。为了达成在代码修改量足够小的前提下,Java 代码必须可以很轻易转换成 Kotlin 语言版本这个条件,10 个基准测试中的 4 个被排除掉了。

int - integer

fp - floating point

ptr - pointer

str - string

Java与Kotlin系列文章之性能问题详解-梦之网科技

表 1: 选择基准测试,其中包含关于大多数操作数据的信息

备注

在基准选择之后 (如表 1 所示),最终的完整基准测试组件都不包含主要对字符串资源进行操作的程序。

代码实现

每一个基准测试都包括如下三个实现的版本:

Java 版本

Kotlin 转换的版本

Kotlin 惯用的实现版本

所有的代码都会用于实验——通过外部的 Python 脚本编译、执行和测试。里面没有添加任何有可能影响结果的实现代码。

文章关键词
Java
编译器
Kotlin