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




