You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kotlin中表示分数的整数对的最快实例化方式探究

Kotlin中表示分数的整数对的最快实例化方式探究

嘿,先聊聊我做这个探究的起因吧:我在代码里需要处理分数,但浮点数的舍入误差实在让人头疼,思来想去还是用一对整数——一个存分子、一个存分母——来表示才靠谱,这样能完全避免精度问题。

不过纠结的问题来了:到底该用哪种类型来存这两个整数呢?是Pair<Int, Int>,大小为2的List<Int>,还是IntArray?我特别想搞清楚这几种类型里,哪种实例化和销毁的速度最快

于是我写了一段测试代码来实测性能:

fun main() {
    var b: Any

    val elapsedPair = measureNanoTime {
        for (i in 0..100000000) {
            b = Pair(-2, 1)
        }
    }
    println(elapsedPair)

    val elapsedList = measureNanoTime {
        for (i in 0..100000000) {
            b = listOf(-2, 1)
        }
    }
    println(elapsedList)

    val elapsedArray = measureNanoTime {
        for (i in 0..100000000) {
            b = intArrayOf(-2, 1)
        }
    }
    println(elapsedArray)
}

每次运行的数值虽有小差异,但结果排序完全固定:

16338200
1340355300
6129200

从结果能明显看出来:IntArray是最快的(有人说这是因为数组在栈上分配),而List<Int>的速度最慢。不过这里有个顾虑:编译器会不会对数组做了特殊优化,导致这个测试结果不够有代表性?另外,Pair会不会有一些底层的优化,让它在实际大多数场景里比数组创建得更快?

目前从实测数据来看数组性能领先,但如果考虑代码可读性和安全性的话,Pair<Int, Int>其实更直观——一眼就能看出是一对关联值,而且它是不可变的;而IntArray是可变的,不小心修改里面的值就麻烦了。所以具体选哪种,还得结合场景:如果是对性能要求极高的高频操作,数组可能更合适;如果更看重代码可读性和安全性,Pair会是更好的选择。

备注:内容来源于stack exchange,提问作者waterstopper

火山引擎 最新活动