在Kotlin中示例化一对整数值以用作分数的最快方法

huus2vyu  于 2023-02-05  发布在  Kotlin
关注(0)|答案(1)|浏览(139)

动机

我需要在代码中示例化分数,而不考虑浮点值的舍入误差,因此,我决定使用一对整数值,一个用于分子,另一个用于分母。

问题

我不知道该用什么:Pair<Int, IntList<Int>IntArray(大小为2的数组和列表)?哪个示例的创建和释放速度最快?

测量

我写了这段代码:

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

很明显,数组是最快的(因为它们在堆栈上),而列表是最慢的。但是编译器可能已经对数组进行了一些优化,所以这些结果并不具有代表性。也许有一些底层的对示例化优化,在大多数情况下会使对创建比数组创建更快。

83qze16e

83qze16e1#

使用数据类:

data class Fraction(val numerator: Int, val denominator: Int)

使用起来真的很方便:

val fraction = Fraction(2,7)
val (numerator, denominator) = fraction

您甚至可以添加自己的运算符:

data class Fraction(val numerator: Int, val denominator: Int) {
    operator fun divide(divisor: Int) = Fraction(numerator, denominator * divisor)
}

val fraction = Fraction(2,7)
val divided = fraction / 3

至于性能,在你证明它是一个问题之前,它并不是一个问题。和性能问题一样,你需要在牺牲代码可读性之前,测量并确定真实的的潜在问题是什么。

相关问题