我的意思是,这是否更快:
myArray[0]++
myArray[1]++
myArray[2]++
...
myArray[1000000000]++
除此之外:
myArray[864981]++
myArray[526]++
myArray[19347]++
...
myArray[86198116]++
还是完全一样?
我知道这是微观优化,但对于复杂网格(在openGL中),这可能会产生影响.
我的意思是,这是否更快:
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
}
}