@NonameMeTrue

Какой самый быстрый способ итерации массива в JS?

Вопрос в сабже. Тестировал множество вариантов, такие как префиксы, постфиксы, предварительное кэширование длины, Array.prototype.forEach, for..of, for, do, while.

Вроде бы понятно, что префиксы(--i, ++i) быстрее постфиксов(i--, i++), так как не создают темповые переменные, дабы вернуть i без изменений на строке вызова, однако иногда, вне зависимости от кэширования длины и for/while, собственно, последние доказывали обратное.

Когда-то и где-то читал, что лучший пробег - это с конца до начала, используя конструкцию:

for(let i = array.length - 1; i >= 0; --i)

Так ли это на самом деле в нынешние дни и лучше стараться использовать итерацию массива с конца, а если такой возможности нету, то использовать конструкцию:

for(let i = 0; i < array.length; ++i)

Хотелось бы получить надёжно-быстро-стабильный вариант для будущих пробегов по массивам, вне зависимости от уже заранее оптимизированных моментов движком, вроде автоматического изменения i++ на ++i.
  • Вопрос задан
  • 1199 просмотров
Пригласить эксперта
Ответы на вопрос 2
@dimoff66
Кратко о себе: Я есть
Вроде бы понятно, что префиксы(--i, ++i) быстрее постфиксов(i--, i++)


В циклах никакой сколь либо ощутимой разницы, если вы проводили действительно тесты, они не могли этого не показать.

Когда-то и где-то читал, что лучший пробег - это с конца до начала, используя конструкцию:

for(let i = array.length - 1; i >= 0; --i)


И что, ваши тесты это подтвердили? Похоже на полную чушь. Какая разница языку отнимать единицу или складывать?

По факту самый быстрый конечно
for(let i = 0; i < array.length; ++i) let value = array[i]


for... of медленнее процентов на 30

forEach медленнее в разы

Точные цифры зависят от реализации в конкретных браузерах и меняются в процессе их развития.

И это совершенно не значит, что везде нужно использовать самый быстрый вариант. Только на суперогромных массивах разница будет реально ощутима.

И есть выражение: "Преждевременная оптимизация - зло". Сначала напишите код, а потом если какие-то его части работают заметно медленно, тогда приступайте к оптимизации. То чем вы занимаетесь - это забивание головы второстепенными вещами.
Ответ написан
@alexalexes
Если заостряться в оптимизации скорости циклов, то я js/php придерживаюсь двух правил:
1) Если количество элементов в массиве на протяжении всего цикла не предполагает изменения, то количество элементов лучше посчитать заранее. Так мы избежим обращения к length при каждой итерации, если интерпретатор совсем туп.
2) Если к i-му элементу идет много обращений в течении одного хода цикла, то этот элемент лучше вытащить отдельным указателем на него.
Все остальное - экономия на спичках.
var item_count = array.length; // считаем заранее кол-во
for(var i = 0; i < item_count; i++)
{
  var item = array[i]; // вытаскиваем ссылку на элемент для простоты доступа
  ...
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы