我的意思是,這更快嗎:
myArray[0]
myArray[1]
myArray[2]
...
myArray[1000000000]
比這個 :
myArray[864981]
myArray[526]
myArray[19347]
...
myArray[86198116]
還是完全一樣?
我知道這是微優化,但對于復雜的網格(在 openGL 中)它可能會產生影響。
uj5u.com熱心網友回復:
這里是用 Kotlin 撰寫的基準測驗。
| 陣列中的專案數 | 測驗計數 | 迭代訪問 | 隨機訪問 |
|---|---|---|---|
| 100_000 | 100 | 0.02 毫秒 | 0.12 毫秒 |
| 1_000_000 | 100 | 6.15 毫秒 | 74.26 毫秒 |
| 5_000_000 | 100 | 33.36 毫秒 | 526.46 毫秒 |
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
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/483657.html
