Kotlin运行时性能_
本文最后更新于:2017年7月12日 凌晨
Kotlin整体的性能相对于Java而言毫不逊色,甚至在一些方面优于Java,本文参考这篇benchmark文章进行Kotlin性能相关总结,关于Kotlin对包大小影响、使用、选择原因等请参考之前的一篇Kotlin的文章,如果对于Java运行时性能感兴趣可以参考这篇文章。
前言
根据benchmark文章所有的所有测试均采样200次,使用单位ops/ms(执行次数/毫秒)(因此数值是越大越好)并且均在以下环境:
- Macbook Pro (2,5 GHz Intel Core i7, 16GB of RAM)
- Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
- Kotlin version (1.1.3)
- JMH (0.5.6)
性能测试结果
1. 性能相比Java更差相关
- 对
varargs
参数展开,Kotlin比Java慢1倍,主要原因是在Kotlin在展开varargs
前需要全量拷贝整个数组,这个是非常高的性能开销。 - 对
Delegated Properties
的应用,**Kotlin相比Java慢10%**。
2. 性能相比Java更优相关
- 对
Lambda
的使用,**Kotlin相比Java快30%**,而对用例中的transaction
添加inline
关键字配置内联后,发现其反而慢了一点点(约1.14%)。 - Kotlin对
companion object
的访问相比Java中的静态变量的访问,Kotlin与Java差不多快或更快一点。 - Kotlin对局部函数(
Local Functions
)的访问相比Java中的局部函数的访问,Kotlin与Java差不多快或更快一点。 - Kotlin的非空参数的使用相比没有使用空检查的Java,Kotlin与Java差不多快或更快一点。
3. Kotlin自身比较
- 对于基本类型范围的使用,无论是否使用
常量引用
还是直接的范围
速度都差不多。 - 对于非基本类型范围的使用,
常量引用
相比直接的范围
会快3%左右。 - 对于范围遍历方式中,
for
循环方式无论有没有使用step
速度都差不多,但是如果对范围直接进行.foreach
速度会比它们慢3倍,因此避免对范围直接使用.foreach
。 - 在遍历中使用
lastIndex
会比使用indices
快2%左右。
实验过程
I. 性能相比Java更差相关
1. varargs
参数
测试发现: 对varargs
参数展开,Kotlin比Java慢1倍,主要原因是在Kotlin在展开varargs
前需要全量拷贝整个数组,这个是非常高的性能开销。
测试用例Kotlin
代码:
1
|
|
测试用例Java
代码:
1
|
|
测试结果(每毫秒执行次数):
Benchmark | 平均值 | 平均误差 |
---|---|---|
javaIntVarargs |
173265.270 | 260.837 |
kotlinIntVarargs |
83621.509 | 990.854 |
2. Delegated Properties
测试发现:对Delegated Properties
的应用,**Kotlin相比Java慢10%**。
测试用例Kotlin
代码:
1
|
|
测试用例Java
代码:
1
|
|
测试结果(每毫秒执行次数):
Benchmark | 平均值 | 平均误差 |
---|---|---|
javaSimplyInitializedProperty |
274394.088 | 554.171 |
kotlinDelegateProperty |
255899.824 | 910.112 |
II. 性能相比Java更优相关
1. Lambda
由于Lambda是在Java8中引入,所以对比的是Java8与Kotlin1.1.3
测试发现:对Lambda
的使用,**Kotlin相比Java快30%**,而对用例中的transaction
添加inline
关键字配置内联后,发现其反而慢了一点点(约1.14%)。
测试用例Kotlin
代码:
1
|
|
测试用例Java
代码:
1
|
|
测试结果(每毫秒执行次数):
Benchmark | 平均值 | 平均误差 |
---|---|---|
javaLambda |
1024302.409 | 1851.789 |
kotlinInlinedFunction |
1344885.445 | 2632.587 |
kotlinLambda |
1362991.121 | 2824.862 |
2. 静态(Companion Objects
)变量访问
测试发现:Kotlin对companion object
的访问相比Java中的静态变量的访问,Kotlin与Java差不多快或更快一点。
测试用例Kotlin
代码:
1
|
|
测试用例Java
代码:
1
|
|
测试结果(每毫秒执行次数):
Benchmark | 平均值 | 平均误差 |
---|---|---|
javaPrivateConstructorCallFromStaticMethod |
398709.154 | 800.190 |
kotlinPrivateConstructorCallFromCompanionObject |
404746.375 | 621.591 |
3. 局部函数(Local Functions
)访问
测试发现:Kotlin对局部函数的访问相比Java中的局部函数的访问,Kotlin与Java差不多快或更快一点。
测试用例Kotlin
代码:
1
|
|
测试用例Java
代码:
1
|
|
测试结果(每毫秒执行次数):
Benchmark | 平均值 | 平均误差 |
---|---|---|
javaLocalFunction |
897015.956 | 1951.104 |
kotlinLocalFunctionCapturingLocalVariable |
909087.356 | 1690.368 |
kotlinLocalFunctionWithoutCapturingLocalVariable |
908852.870 | 1822.557 |
4. 空检查(Null safety
)
测试发现:Kotlin的非空参数的使用相比没有使用空检查的Java,Kotlin与Java差不多快或更快一点。
测试用例Kotlin
代码:
1
|
|
测试用例Java
代码:
1
|
|
测试结果(每毫秒执行次数):
Benchmark | 平均值 | 平均误差 |
---|---|---|
javaSayHello |
73353.725 | 155.551 |
kotlinSayHello |
75637.556 | 162.963 |
III. Kotlin自身比较
1. 基本类型范围
测试发现: 对于基本类型范围的使用,无论是否使用常量引用
还是直接的范围
速度都差不多。
常量引用基本类型范围用例:
1
|
|
直接引用基本类型范围的用例:
1
|
|
测试结果(每毫秒执行次数):
Benchmark | 平均值 | 平均误差 |
---|---|---|
kotlinIndirectRange |
1214464.562 | 2071.128 |
kotlinLocallyDeclaredRange |
1214883.411 | 1797.921 |
2. 非基本类型范围
测试发现: 对于非基本类型范围的使用,常量引用
相比直接的范围
会快3%左右。
常量引用非基本类型范围用例:
1
|
|
直接引用非基本类型范围的用例:
1
|
|
测试结果(每毫秒执行次数):
Benchmark | 平均值 | 平均误差 |
---|---|---|
kotlinStringRangeInclusionWithLocalRange |
211468.439 | 483.879 |
kotlinStringRangeInclusionWithConstantRange |
218073.886 | 412.408 |
3. 范围遍历
测试发现: 对于范围遍历方式中,for
循环方式无论有没有使用step
速度都差不多,但是如果对范围直接进行.foreach
速度会比它们慢3倍,因此避免对范围直接使用.foreach
。
for
循环的用例:
1
|
|
for
循环并且加上step
的用例:
1
|
|
对范围直接进行.foreach
的用例:
1
|
|
测试结果(每毫秒执行次数):
Benchmark | 平均值 | 平均误差 |
---|---|---|
kotlinRangeForEachFunction |
108382.188 | 561.632 |
kotlinRangeForEachLoop |
331558.172 | 494.281 |
kotlinRangeForEachLoopWithStep1 |
331250.339 | 545.200 |
4. 对于indices
对比
测试发现: 使用lastIndex
会比使用indices
快2%左右。
先创建一个SparseArray
:
1
|
|
使用indices
的用例:
1
|
|
使用lastIndex
的用例:
1
|
|
测试结果(每毫秒执行次数):
Benchmark | 平均值 | 平均误差 |
---|---|---|
kotlinCustomIndicesIteration |
79096.631 | 134.813 |
kotlinIterationUsingLastIndexRange |
80811.554 | 122.462 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2022-09-14 Build was configured to prefer settings repositories over project repositories but repository ...
2021-09-14 PGrid 蓝牙连接重复类
2019-09-14 树莓派安装最新安卓系统7.0
2019-09-14 下载Android5.1.1源码、编译源码、SDK和内核
2019-09-14 Android系统6.0源代码编译过程分析(2)之编译SDK及内核
2019-09-14 Android系统6.0源代码编译过程分析(1) AAAAAA
2019-09-14 AAAAAA_Android多版本源码及内核编译(Nexus5)