简单测试 Kotlin native 性能

栏目: Java · 发布时间: 5年前

内容简介:一直使用kotlin JVM平台开发服务器的应用,最近想试试看 Kotlin native的性能。我使用的是 kotlin native 1.3.21,要使用他非常的简单,下载最新的 IDEA ,我下载的是 IntelliJ IDEA 2018.3.4 (Community Edition),然后新建项目时选择 “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优化(我猜的)。

至于为什么,我无法知道,

所以,还是比较多的坑。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

移动风暴

移动风暴

[美]弗雷德·沃格尔斯坦 / 朱邦芊 / 中信出版社 / 2014-1-1 / 39

也许,除了伟大的乔布斯,每一位奋力改变世界的硅谷英雄,都值得我们肃然起敬。苹果与谷歌十年博弈,关于这场移动平台战争的报道早已铺天盖地,而这是第一次,我们能听到幕后工程师的真实声音。两大科技巨人用智能手机和平板电脑颠覆了电脑产业。它们位处变革的中心,凭借各自的经营哲学、魅力领袖和商业敏感度,把竞争变成了残酷对决。商业记者沃格尔斯坦报道这场对抗已逾十载,在《移动风暴》中,他带领我们来到一间间办公室和会......一起来看看 《移动风暴》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具