【问题标题】:Does the order of nested loops matter for speed [duplicate]嵌套循环的顺序对速度是否重要[重复]
【发布时间】:2013-10-29 12:32:14
【问题描述】:

假设我有两个数组arrayOnearrayTwo,其中arrayOne.length != arrayTwo.length(假设两个List 具有不同size() 的类似情况)。以下任何一项是否比另一项具有速度优势?

  • 选项 1

    for(int i = 0 ; i < arrayOne.length ; ++i) {
       for(int j = 0 ; j < arrayTwo.length ; ++j) {
        //Do something
       }
    }
    
  • 选项 2

    for(int i = 0 ; i < arrayTwo.length ; ++i) {
       for(int j = 0 ; j < arrayOne.length ; ++j) {
        //Do something
       }
    }
    

【问题讨论】:

  • 你在循环中做什么?哪个数组更大?处理器缓存可能会产生很大的影响,循环的顺序可能会显着改变缓存行为。

标签: java arrays performance loops nested-loops


【解决方案1】:

没有一般的结果。这取决于您的系统和运行时的各种情况。进行基准测试并获得自己的结果。但是使用更多cache locality 的通常更快

在 2D 数组的情况下,在 row-major 语言中,逐行逐列迭代通常更快,反之亦然。但这仅当您遍历数组的每个或大部分时。 Java 是 neither row nor column-major,因此没有一种方法可以在每种情况下都始终更快

如果像这样遍历 2 个不同的数组,那么没有人真正知道它的行为方式

另见Why does cache locality matter for array performance?

【讨论】:

  • 什么是“更多地方性”?
  • @user2763361:访问内存的局部性 - 基本上,如果您经常访问同一内存区域,那将比在该位置周围打点更有效。
  • 哇 Jon Skeet 回复我的消息!!!!!
【解决方案2】:

假设

arrayOne.length = m
arrayTwo.length = n

计算时间复杂度

for(int i = 0 ; i < arrayOne.length ; ++i) {         // O(m)
  for(int j = 0 ; j < arrayTwo.length ; ++j) {  // O(n)
     //Do something
  }
}

时间复杂度 - O(m)*O(n) = O(mn)

for(int i = 0 ; i < arrayTwo.length ; ++i) {         // O(n)
  for(int j = 0 ; j < arrayOne.length ; ++j) {  // O(m)
     //Do something
  }
}

时间复杂度 - O(n)*O(m) = O(nm) = O(mn)

因此,假设您的“做某事”在两种情况下花费的时间相似,那么这两种选择都应该花费相同的时间。

【讨论】:

  • 理论时间复杂度与实际时间不同 - 因为您假设“做某事”在两种情况下将花费相同的时间。
  • 这是一个非常幼稚的分析。内部循环的性能通常受数据局部性等因素的影响。例如,切换矩阵乘法的循环可能会导致性能上的显着差异。
  • 如果“做某事”需要 O(1) 那么这将成立。我已经提到了我所做的假设。但由于 OP 没有说任何关于“做某事”的内容,所以我不能添加更多内容。
  • @user2743361 是的,删除了我的评论。
  • @AnkitRustagi 你完全忽略了前置因素。即使“做某事”是 O(1),也不能保证对于不同的循环顺序,前置因子是相同的。事实上,有很多不是这样的例子。当您访问附近的内存时,现代处理器表现最好,因为它已经在缓存中。切换循环,例如矩阵乘法,会导致处理器在内部循环的每次迭代中使高速缓存行无效。因此,虽然您的渐近分析在技术上是正确的,但它忽略了常量前因数实际上很重要的现实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 2018-02-07
  • 2013-01-17
相关资源
最近更新 更多