简单测试 Kotlin native 性能
准备
一直使用kotlin JVM平台开发服务器的应用,最近想试试看 Kotlin native的性能。
我使用的是 kotlin native 1.3.21,要使用他非常的简单,下载最新的 IDEA ,我下载的是 IntelliJ IDEA 2018.3.4 (Community Edition),然后新建项目时选择 “Kotlin/Native”,非常的简单了。
测试环境如下:
Windows 10 64 位
Intel Core i5-6500 @3.2GHz 4 Core
16GB RAM
测试代码
这个项目还在初期,所以对应的库一定还不成熟,所以,我尽力避免使用库,而且不同的库实现不同和使用不当,都可能造成测试不准确。
所以我测试简单的循环,int的位操作,这些指令都是对编译器的考验,下面的测试代码就是检测一个int32值,包含几个有效的 1 位。
package sample //import kotlin.random.Random
import kotlin.system.measureNanoTime fun main() {
runIt()
} private fun runIt(){
var sum = 0
val time = measureNanoTime{
//val ran = Random.Default
for (i in 0 until 1_0000_0000){
//val v = ran.nextInt()
sum += getInt32TrueCount(i)
}
}
// 292 056 900
println("共耗时:$time ns, result: $sum")
} private fun getInt32TrueCount(value: Int):Int {
if (value == 0) {
return 0
} return getByteTrueCount(value and 0xFF) +
getByteTrueCount((value shr 8) and 0xFF) +
getByteTrueCount((value shr 16) and 0xFF) +
getByteTrueCount((value shr 24) and 0xFF)
} private fun getByteTrueCount(value: Int) : Int{
if(value== 0){
return 0
} val a = (value and 0x1)
val b = ((value and 0x2) shr 1)
val c = ((value and 0x4) shr 2)
val d = ((value and 0x8) shr 3)
val e = ((value and 0x10) shr 4)
val f = ((value and 0x20) shr 5)
val g = ((value and 0x40) shr 6)
val h = ((value and 0x80) shr 7) return a + b + c + d + e + f + g + h
}
测试结果
Kotlin有个非常大的好处,常见的库都可以在 jvm 平台和 native 平台通用,所以上面的代码可以直接复制到 Kotlin 的jvm环境下执行。
在 Gradle 面板中,找到 Tasks -> run -> runMainReleaseExecutableMingw,就可以运行程序。
耗时如下:
Kotlin Native : 292 056 900 ns
Kotlin Jvm :1 220 617 300 ns
可以明显看见,native是jvm的 4被性能,我在怀疑是不是 native 的LLVM编译器 实现了并行,不然怎么差不多4倍呢?
坑
你可能注意到,我注释了随机数产生的函数调用,这是因为我发现 native 平台下,默认的随机数产生非常的慢,远远慢于 Jvm 平台。所以库可能不太成熟。
SIMD
LLVM平台的最大亮点是性能的优化,比如 SIMD,所以我尝试修改程序,看看是否能启用SIMD,所以我修改了函数,新代码如下:
private val m1 = intArrayOf(0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80) private fun getByteTrueCount(value : Int) : Int{
if (value == 0) {
return 0
} var sum = 0
for (i in 0 until m1.size){
sum += (value and m1[i] shr i)
} return sum
}
然而,悲剧发生了,执行时间如下:
Kotlin Native : 80 610 886 500 ns
Kotlin Jvm : 1 297 672 800 ns
最终,native平台花了整整80多秒,你没有看错, native慢了很多很多,而JVM平台似乎能聪明的实现了SIMD优化(我猜的)。
至于为什么,我无法知道,
所以,还是比较多的坑。
后记
我提了一个 Issue 给了kotlin native,参见:https://github.com/JetBrains/kotlin-native/issues/2660
他们建议不要使用全局的数组,我修改了,效果不明显。
另外,他们还建议使用 GCC的内置函数 __builtin_popcount
至于为什么 native 比 Jvm 平台这段代码要慢的原因,他们的意见是现在还是 beta 哪,不要做性能测试。
虽然有一些问题,但是我任然非常期待 Kotlin native,这样学会一个 kotlin ,就所有平台通杀了。
简单测试 Kotlin native 性能的更多相关文章
- Kotlin/Native KMM项目架构
一.什么是KMM? Kotlin Multiplatform Mobile ( KMM ) 是一个 SDK,旨在简化跨平台移动应用程序的创建.在 KMM 的帮助下,您可以在 iOS 和 Android ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(37)-文章发布系统④-百万级数据和千万级数据简单测试
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(37)-文章发布系统④-百万级数据和千万级数据简单测试 系列目录 我想测试EF在一百万条数据下的显示时间! ...
- struts2+hibernate+spring配置版框架搭建以及简单测试(方便脑补)
为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->M ...
- Linux如何查看与测试磁盘IO性能
1. 查看磁盘 IO 性能 1.1 top 命令 top 命令通过查看 CPU 的 wa% 值来判断当前磁盘 IO 性能,如果这个数值过大,很可能是磁盘 IO 太高了,当然也可能是其他原因,例如网络 ...
- Linux测试硬盘读性能的常用工具-hdparm和dd俩搭档
Linux测试硬盘读性能的常用工具-hdparm和dd俩搭档 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.hparm # 它用来在基于 Linux的系统上获取或 ...
- (转)常见存储过程分页PK赛——简单测试分析常见存储过程分页速度
原文地址:http://www.cnblogs.com/yangyy753/archive/2013/01/23/2872753.html 数据的分页是我们再熟悉不过的功能了,各种各样的分页方式层出不 ...
- Docker安装canal、mysql进行简单测试与实现redis和mysql缓存一致性
一.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求 ...
- 技术分享 | 简单测试MySQL 8.0.26 vs GreatSQL 8.0.25的MGR稳定性表现
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. M ...
- TODO:Golang UDP连接简单测试慎用Deadline
TODO:Golang UDP连接简单测试慎用Deadline UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interco ...
随机推荐
- Mysql如何进行分组,并且让每一组的结果按照某个字段排序,并且获取每一组的第一个字段
select * from (select * from table_name order by id desc) h where h.catagory_id in(value1,value2,val ...
- textarea如何实现高度自适应?
今天需要些一个回复评论的页面,设计师给的初始界面就是一个只有一行的框.然后当时就想这个交互该怎么实现比较好,然后想起了新浪微博的做法:点击评论,默认显示一行,当输入的文字超过一行或者输入Enter时, ...
- IP通信基础学习第四周(上)
IP地址现在由因特网名字与号码指派公司ICANN进行分配,它是标志一个主机(或路由器)和一条链路的接口,其编址方法有:分类的IP地址.子网的划分.构成超网. 分类两级IP地址可以记为:IP::={&l ...
- 通过本质看现象:关于Integer受内部初始化赋值范围限制而出现的有趣现象
左手代码,右手文章.——朱季谦 这是我的第一篇技术博客,作为一名技术小菜鸟,总体而言显得很拙见,但也算是成长路上的一个小脚印,希望能在以后的日子里,可以对JAVA技术有一个更加深入的思考与认识. 前几 ...
- window 10 删除带有管理员权限的Oracle文件夹
因为文件已经被删除就不附图解释了 因为文件安装的方式错误,所以本是按照正常步骤卸载Oracle,前面的禁用Orace服务与删除Oracle注册表都没有出错,但到最后一步---------Oracle文 ...
- 2019/4/18 wen 线程
- python模块的使用
这位老师的文章说的很清楚:模块 这里我只说一下,我在使用过程中的一些注意事项. 比如,我创建了一个包,该包下面有两个模块:model1和model2,如下图 那么我们再python中怎样去使用自己创建 ...
- Gatling实战(二)
在上一篇实战讲解了Gatling的用例,不过还没涉及到性能方面的内容,其实用例中的最后一句就和性能有关了 setUp(scn.inject(atOnceUsers(1)).protocols(http ...
- [Python数据挖掘]第2章、Python数据分析简介
<Python数据分析与挖掘实战>的数据和代码,可从“泰迪杯”竞赛网站(http://www.tipdm.org/tj/661.jhtml)下载获得 1.Python数据结构 2.Nump ...
- kali网络配置
touch 1.txt#创建一个文件 配置网卡 auto eth0iface eth0 inet staticaddress 172.16.30.102#要设置的主机IP地址netmask 255.2 ...