2017-01-27 2 views
0

Мой вопрос относительно прост. Но я подозреваю, что ответ будет сложным и интересным. У меня есть два фрагмента итерации через цикл в Javascript.Почему этот метод итерации быстрее?

Отрывок A:

//Fast 
var l = arr.length; 
for (var x = 0; x < l; x++) { 
    dosmth = arr[x]; 
} 

Отрывок B:

//Very Fast 
var l = arr.length; 
var x = 0; 
while (x>l) { 
    dosmth = arr[x]; 
    x++; 
} 

Отрывок B значительно быстрее, чем сниппета А. Почему это? Я подозреваю, что это связано с тем, что в фрагменте текста больше изменений контекста или контекста. Но я не могу найти на нем никакой документации.

+15

Похоже, ваши логические проверки перевернуты х < l vs x > л – Submersed

+1

Какие браузеры вы проверить в? Является ли второй пример быстрее в * каждом браузере? Кроме того, как вы находите время выполнения подходов? –

+0

Какой механизм JavaScript вы используете? – uncoder

ответ

3

Чтобы расширить мой комментарий, последний, вероятно, не ударяет по итерациям, так как проверки перевернуты. В первом вы проверяете x < l и второй x> l.

1

Вы пропустите немного более быструю версию с одной переменной и неявной проверкой, но она бежит назад.

var i = array.length; 
while (i--) { 
    dosmth = arr[x]; 
} 
+1

. Я читал, что когда вы перебираете массив назад, некоторые двигатели переключают базовую структуру данных на хэш, что было бы хуже. Поэтому я рекомендую против такого рода микрооптимизации – Oriol

+1

Не оптимизируйте без правильного профилирования и тестирования. Во-первых, я думаю, вы имели в виду arr [x]. Во-вторых, я бы не верил, что это будет быстрее (возможно, даже медленнее) на сегодняшнем оборудовании. – Axel

+0

, но почему двигатель должен делать назад итерацию медленнее, чем восходящая итерация. иногда бывает необходимо итерации с конца. –

Смежные вопросы