ES6 JavaScript - констант внутри или пустым циклом? - PullRequest
0 голосов
/ 12 июня 2018

В целях повышения производительности я хочу знать, в чем разница в JavaScript ES6 между:

var list = [...];
let item; //let outside the loop
for (let i = 0; i < list.length; i++) {
    item = list[i];
}

и

var list = [...];
for (let i = 0; i < list.length; i++) {
    const item = list[i]; //const inside the loop
}

Предположим, что переменная item предназначена для сохраненияконстанта внутри цикла.

Рекомендуется ли?Каковы плюсы и минусы относительно производительности для каждого?GC обрабатывает их по-разному?

Обратите внимание, что это микрооптимизация.Кроме того, производительность зависит от используемого движка JS .. (см. Ответы)

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

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


Необходимо учитывать две вещи:

  1. let против const
  2. объявление переменной в пределахloop

И то, и другое будет зависеть от реализации браузера, таким образом, производительность не установлена ​​на должном уровне;однако обычно первое (объявление let вне цикла) должно дать более эффективный результат, поскольку объявление переменных обычно требует больше OPS, чем просто присвоение значения.

Важно отметить, что эффективность результатабудет зависеть от нескольких факторов.Они включают, но не ограничиваются:

  • ресурсами системы, использованными для выполнения кода
  • тип выполняемой операции (если отличается от исходного примера)
  • длина списка и размер его значений

Несмотря на то, что трудно определить, насколько более эффективным будет код, важно отметить в средних условиях (средний многоядерныйнастольный компьютер с не менее 2 ГБ ОЗУ) со списком среднего размера (например, 5 тыс. элементов), разница в результатах составит нано-микросекунды, и, как правило, такая разница считается микрооптимизацией.

0 голосов
/ 12 июня 2018

Будет сложно дать однозначный ответ, учитывая, что разные браузеры имеют очень разные внутренние реализации. С большой вероятностью может быть нулевая разница.Перед выполнением Javascript в браузере компилируется внутренним JIT-компилятором, который, скорее всего, распознает избыточное объявление переменной внутри цикла и оптимизирует его, как любой другой хороший компилятор.let и const определенно повлияют на это, я бы сказал, что const сделает оптимизацию вне цикла еще более вероятной, учитывая, что компилятор может сразу увидеть, что это неизменяемая атомная переменная, специфичная для области видимости внутреннего цикла.Это также может развернуть циклы с высокой производительностью.В Javascript есть несколько других проблем с производительностью, хотя, когда доступ к переменным в более высоких областях приводит к небольшому снижению производительности, я вспоминаю, как смотрел это давным-давно, когда делал gamdev в браузере.Это может быть уже не актуально, но это было несколько лет назад.

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

0 голосов
/ 12 июня 2018

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

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

...