我的意思是,这是否更快:

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
  }

}

Java相关问答推荐

如何专门保存数据而不显示在jTable中?

在Spring Boot中测试时出现SQL语法错误

在URL类图中表示Java swing类

Java WireMock定义存根在Cucumber并行执行的多线程测试中失败

将成为一个比较者.比较…在现代Java中,编译器会对`CompareTo`方法进行优化吗?

AlarmManager没有在正确的时间发送alert

S的字符串表示是双重精确的吗?

嵌入式ActiveMQ Artemis Web控制台加载错误

如何从JNI方法正确调用NSOpenPanel以在正确的线程上运行?

第三方Jar pom.xml

GetChildren().emoveAll()不会删除 node

如何在一行中使用Dijkstra中的Java Stream

Java17支持哪个MapR版本?

Spring动态反序列化JSON可以是列表,也可以只是一个对象

在Java泛型中使用通配符时,如何推断类型

通过/失败的参数化junit测试方法执行数

为什么使用lo索引来解决二进制搜索问题不同于使用hi索引?

rest api服务 spring 启动中出现IllegalFormatConversionException

Java返回生成器的实现

放置在变量中的Java成员引用不相等