В вложенном цикле for есть ли какое-либо преимущество в запуске с более длинным циклом? Или наоборот?

например:

var longArray = [1, 2, 3, 4]
var shortArray = [2, 3]

какой из них быстрее?

длинный цикл первый:

for (var i = 0; i < longArray.length; i++) {
  for (var j = 0; j < shortArray.length; j++) {
    if (longArray[i] === shortArray[j]) {
      // do something
    }
  }
}

или короткий цикл первый:

for (var i = 0; i < shortArray.length; i++) {
  for (var j = 0; j < longArray.length; j++) {
    if (longArray[i] === shortArray[j]) {
      // do something
    }
  }
}

или есть какие-то преимущества в том, что я не рассматриваете? Или это не важно?

2 ответов


сначала короткий цикл обычно быстрее, только потому, что он тратит больше времени на посещение элементов в том же порядке, что и они, как правило, выкладываются в память. Вам нужно longArray иметь намного больше элементов, по крайней мере, несколько тысяч. Вот тестовый пример, чтобы продемонстрировать разницу: https://jsperf.com/loop-order-sl

для массивов, которые вы разместили, который имеет longArray Это относительно мало, есть незначительная разница в производительности. Чем короче время может быть немного быстрее, чем @ Ajaypayne наблюдал или наоборот в зависимости от окружающей среды.


между ними нет существенной разницы. В зависимости от того, как вы оцениваете его, вы можете получить небольшое увеличение скорости так или иначе, но это никогда не составит много. В конце концов у вас будет i*j общая итераций. Итак, как вы принимаете решение, в какую сторону идти?

  1. в зависимости от конкретных обстоятельств вы можете устранить определенные итерации. @Mark_M попадает на это в своем комментарии о сортировке. Если вы проверяете для равенства и они оба отсортированы, то вы можете выйти из внутреннего цикла, как только вы получите хит. Такие мелочи могут привести к значительному общему выигрышу в особенно длительном коде. (Не то чтобы я когда-либо запускал линейный поиск через отсортированные массивы, но это не имеет значения.)

  2. Если есть четкий способ замкнуть цикл, как описано в (1), то стреляйте для ясности, а не для производительности. Даже если вы кодируете только для себя, глядя на код вы написали 6 месяцев назад, и это часто сбивает с толку. Выберите, что кажется более естественным или очевидным, и сохраните себя (и других) головные боли позже.