Главная

Что работает быстрее: while, For, forEach(), For…of ?

Сравнение скорости работы итерационных структур в JavaScript

Поделиться:
 

42+

Я не работаю в качестве full-time программиста, поэтому при написании кода зачастую приходится полагаться на фундаментальные знания в computer science.

Я очень удивился, когда узнал о методе forEach() в JavaScript, который можно использовать в качестве замены традиционному циклу for. Также мне недавно сделали вежливый выговор за то, что я не использую цикл for… of.
Многие утверждают, что метод for … of превосходит метод .forEach() по скорости работы, а также является более читабельным. Несмотря на то что я не работаю над проектами, где важна скорость работы, все же этот вопрос меня заинтересовал. Насколько быстро работает каждый из типов итерационных структур?

Введение

Прежде чем мы начнем, давайте сделаем небольшой обзор различных типов итерационных структур.
●  While: самый простой из циклических механизмов. Цикл while будет выполняться до тех пор, пока заданное условие имеет значение true.
● Цикл for: используется в том случае, когда число итераций известно. Объявление цикла for состоит из трех компонентов: инициализация переменной, условия окончания цикла и оператор, выполняемый после каждой итерации.
.forEach(): метод класса array, который принимает один аргумент, который, в свою очередь, является функцией. Данная функция применяется к каждому элементу массива.
For … of : Самая новая структура итерации. Данная структура требует указания временной переменной, которой будет присваиваться каждый элемент массива при его итерации.

Тестирование

Чтобы проверить скорость работы каждого цикла, я создал массивы из 101001000 и 1000000 целых чисел. Также я использую методы console.time() и console.timeEnd(), чтобы узнать скорость работы каждой итерационной структуры.

Результаты

Результаты оказались довольно интересными и отнюдь не такими, как я ожидал. В первой таблице записаны результаты тестов для циклов, в которых не производились никакие дополнительные операции, а во второй — считался квадратный корень итерируемого числа.(время подано в миллисекундах).

Выводы:

❶ Цикл while лучше всего подходит для работы с большими массивами.
❷ Цикл for … of лучше всего работает с небольшими наборами данных, но плохо с большими.
❸  .forEach() и for…of достаточно схожи в скорости работы и в них нет явно выраженного перевеса в чью-либо сторону.
❹ Время выполнения .forEach() во многом зависит от того, какие операции выполняются внутри цикла.
❺ Стандартный цикл for посредственный во всех направлениях.

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

Спасибо!

42+