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
  }

}