Kotlin/Java 是否使用缓存系统来提高迭代数组时的性能?
Does Kotlin/Java use a cache system to improve the performance when iterating arrays?
我的意思是,这样更快吗:
myArray[0]++
myArray[1]++
myArray[2]++
...
myArray[1000000000]++
比这个:
myArray[864981]++
myArray[526]++
myArray[19347]++
...
myArray[86198116]++
还是完全一样?
我知道这是微优化,但对于复杂的网格(在 openGL 中)它可能会产生影响。
这里是用 Kotlin 编写的基准测试。
Number Of Items in Array
Test count
Iterative Access
Random Access
100_000
100
0.02 ms
0.12 ms
1_000_000
100
6.15 ms
74.26 ms
5_000_000
100
33.36 ms
526.46 ms
import kotlin.time.*
fun main(args: Array<String>) {
val tester = ArrayAccessTest()
val maxIteration = 100
val numberOfItems = 1_000_000
val myArrayForIterate = Array(numberOfItems) { 0 }
val myArrayForRandom = Array(numberOfItems) { 0 }
val meanOfIterate = tester.iterate(myArrayForIterate, maxIteration)
val meanOfRandom = tester.randomAccess(myArrayForRandom, maxIteration)
println("elapsed mean time for iterative access = $meanOfIterate ms")
println("elapsed mean time for random access = $meanOfRandom ms")
}
@OptIn(ExperimentalTime::class)
class ArrayAccessTest {
fun iterate(myArray: Array<Int>, maxIteration: Int): Double {
val elapsedTimes = mutableListOf<Duration>()
for (i in 0 until maxIteration) {
val elapsedTime = measureTime {
for (index in myArray.indices) {
myArray[index]++
}
}
elapsedTimes.add(elapsedTime)
}
return getMeanOf(elapsedTimes)
}
fun randomAccess(myArray: Array<Int>, maxIteration: Int): Double {
val elapsedTimes = mutableListOf<Duration>()
val randomIndexes: Array<Int> = myArray.indices.shuffled().toTypedArray()
for (i in 0 until maxIteration) {
val elapsedTime = measureTime {
for (index in randomIndexes) {
myArray[index]++
}
}
elapsedTimes.add(elapsedTime)
}
return getMeanOf(elapsedTimes)
}
private fun getMeanOf(elapsedTimes: List<Duration>): Double {
var total = 0.0
for (elapsedTime in elapsedTimes) {
total += elapsedTime.inWholeMilliseconds
}
return total / elapsedTimes.size
}
}
我的意思是,这样更快吗:
myArray[0]++
myArray[1]++
myArray[2]++
...
myArray[1000000000]++
比这个:
myArray[864981]++
myArray[526]++
myArray[19347]++
...
myArray[86198116]++
还是完全一样?
我知道这是微优化,但对于复杂的网格(在 openGL 中)它可能会产生影响。
这里是用 Kotlin 编写的基准测试。
Number Of Items in Array | Test count | Iterative Access | Random Access |
---|---|---|---|
100_000 | 100 | 0.02 ms | 0.12 ms |
1_000_000 | 100 | 6.15 ms | 74.26 ms |
5_000_000 | 100 | 33.36 ms | 526.46 ms |
import kotlin.time.*
fun main(args: Array<String>) {
val tester = ArrayAccessTest()
val maxIteration = 100
val numberOfItems = 1_000_000
val myArrayForIterate = Array(numberOfItems) { 0 }
val myArrayForRandom = Array(numberOfItems) { 0 }
val meanOfIterate = tester.iterate(myArrayForIterate, maxIteration)
val meanOfRandom = tester.randomAccess(myArrayForRandom, maxIteration)
println("elapsed mean time for iterative access = $meanOfIterate ms")
println("elapsed mean time for random access = $meanOfRandom ms")
}
@OptIn(ExperimentalTime::class)
class ArrayAccessTest {
fun iterate(myArray: Array<Int>, maxIteration: Int): Double {
val elapsedTimes = mutableListOf<Duration>()
for (i in 0 until maxIteration) {
val elapsedTime = measureTime {
for (index in myArray.indices) {
myArray[index]++
}
}
elapsedTimes.add(elapsedTime)
}
return getMeanOf(elapsedTimes)
}
fun randomAccess(myArray: Array<Int>, maxIteration: Int): Double {
val elapsedTimes = mutableListOf<Duration>()
val randomIndexes: Array<Int> = myArray.indices.shuffled().toTypedArray()
for (i in 0 until maxIteration) {
val elapsedTime = measureTime {
for (index in randomIndexes) {
myArray[index]++
}
}
elapsedTimes.add(elapsedTime)
}
return getMeanOf(elapsedTimes)
}
private fun getMeanOf(elapsedTimes: List<Duration>): Double {
var total = 0.0
for (elapsedTime in elapsedTimes) {
total += elapsedTime.inWholeMilliseconds
}
return total / elapsedTimes.size
}
}