准备

一直使用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 性能的更多相关文章

  1. Kotlin/Native KMM项目架构

    一.什么是KMM? Kotlin Multiplatform Mobile ( KMM ) 是一个 SDK,旨在简化跨平台移动应用程序的创建.在 KMM 的帮助下,您可以在 iOS 和 Android ...

  2. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(37)-文章发布系统④-百万级数据和千万级数据简单测试

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(37)-文章发布系统④-百万级数据和千万级数据简单测试 系列目录 我想测试EF在一百万条数据下的显示时间! ...

  3. struts2+hibernate+spring配置版框架搭建以及简单测试(方便脑补)

    为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->M ...

  4. Linux如何查看与测试磁盘IO性能

    1. 查看磁盘 IO 性能 1.1 top 命令 top 命令通过查看 CPU 的 wa% 值来判断当前磁盘 IO 性能,如果这个数值过大,很可能是磁盘 IO 太高了,当然也可能是其他原因,例如网络 ...

  5. Linux测试硬盘读性能的常用工具-hdparm和dd俩搭档

    Linux测试硬盘读性能的常用工具-hdparm和dd俩搭档 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.hparm        # 它用来在基于 Linux的系统上获取或 ...

  6. (转)常见存储过程分页PK赛——简单测试分析常见存储过程分页速度

    原文地址:http://www.cnblogs.com/yangyy753/archive/2013/01/23/2872753.html 数据的分页是我们再熟悉不过的功能了,各种各样的分页方式层出不 ...

  7. Docker安装canal、mysql进行简单测试与实现redis和mysql缓存一致性

    一.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求 ...

  8. 技术分享 | 简单测试MySQL 8.0.26 vs GreatSQL 8.0.25的MGR稳定性表现

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. M ...

  9. TODO:Golang UDP连接简单测试慎用Deadline

    TODO:Golang UDP连接简单测试慎用Deadline UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interco ...

随机推荐

  1. 认识.net

    .NET多指NET Framework,Visual Studio.NET及其开发的应用程序.NET Framework是一个开发和执行环境,允许不同的程序语言和库无缝结合基于Window的应用程序. ...

  2. omitting directory `folder/'

    题记:一个问题,若遇见第一次,不知道如何解决,经查资料后处理掉可以原谅:若遇见第二次,还是一头雾水!反省自己,特此备录. 在linux CentOS6.5 系统中复制文件夹时提示如下: cp: omi ...

  3. DNS 本质

    DNS 本质: 层级分布式数据库

  4. python3下爬取网页上的图片的爬虫程序

    import urllib.request import re #py抓取页面图片并保存到本地 #获取页面信息 def getHtml(url): html = urllib.request.urlo ...

  5. IDEA建立Spring MVC Hello World 详细入门教程

    https://www.cnblogs.com/wormday/p/8435617.html

  6. Referer图片防盗链

    前几天讲了<nginx下载防盗链>,今天继续说下图片防盗链. 他们两个使用的指令不同,前者使用secure link,并且需要程序配合,但是效果非常好;后者不需要程序配合,根据图片来源来实 ...

  7. JavaScript实现自定义日期时间

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 【mac微信小助手】WeChatPlugin使用教程!

    微信小助手 mac版集微信防撤回和微信多开等诸多功能于一身,可以有效的阻止朋友微信撤回消息,还能开启无手机验证登录,再也不用每次登录扫码验证啦,非常方便!   wechatplugin mac版安装教 ...

  9. 施密特正交化 GramSchmidt

    施密特正交化 GramSchmidt 施密特正交化的原名是 Gram–Schmidt process,是由Gram和schmidt两个人一起发明的,但是后来因为施密特名气更大,所以该方法被简记为施密特 ...

  10. Linux下复制文件

    命令: cp -Rf /文件名1/*               /文件名2 把文件夹1下的文件复制到文件2中(/* 表示复制文件夹1下的文件,不复制文件夹1)