微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我很好奇Kotlin的toList和IntArray之间的速度差异

如何解决我很好奇Kotlin的toList和IntArray之间的速度差异

我很好奇看到Kotlin的toList返回了什么,所以我进行了测试。

fun loop(i: Int){
    for(i in 0..i){}
}

fun main() {
    val list: List<Int> = (1..100000).toList()
    val arr =  IntArray(100000) { i -> i}

    println("list : ForLoop Time: " + measureNanoTime {
        for (i in list) { loop(i) }
    })

    println("list : ForEach Time: " + measureNanoTime {
        list.forEach { i -> loop(i) }
    })

    println("Array : ForLoop Time: " + measureNanoTime {
        for (i in arr) { loop(i) }
    })

    println("Array : ForEach Time: " + measureNanoTime {
        arr.forEach { i-> loop(i) }
    })
}

输出

enter image description here

当我向上看时,toList以Array的形式返回,但是我不知道为什么速度会有很多差异。 toList是否作为LinkedList返回?

我想知道。

解决方法

Tenfour04指出,像这样的微基准受JVM预热,动态编译和性能分析,系统和定时抖动,高速缓存效果以及其他混杂因素的影响很大,它们并不能在很大程度上告诉您所有。对少量代码进行基准测试非常困难,到目前为止,最好使用为您完成所有艰苦工作的框架。

但是,您在这里看到的效果似乎很可能是拳击效果。

IntArray是(原始)整数的数组。

List<Int>是对Int对象的引用的列表(可能存储为数组),每个对象都包含一个原始整数。

因此,列表不仅需要存储数组,还需要存储所有单独的Int对象;结果,它将占用更多的内存-可能要多几倍。

虽然数组版本对内存进行了简单的线性扫描(可能受益于内存缓存),但列表版本将访问所有单个Int对象(可能位于堆中不可预测的位置)以及扫描其引用数组,可能从内存缓存中获得的收益要少得多。

如果您想进行更公平的比较,您可能会发现Array<Int>的行为更像List<Int>。 (当然,一般建议使用Array<Int>并不是 -这个问题说明了为什么不这样做的一个很好的理由!)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。