Javascript простой для цикла против... для спектаклей

Я видел, что с ECMA 6 мы можем использовать for...of вместо традиционного для цикла:

for( let i = 0 ; i < arr.length ; i++ ) {
    var elm = arr[i];
    // do stuff
}

В.С.

for( let elm of arr ) {
    // do stuff
}

Видите ли вы, что второй вариант более читабелен, прост и удобен в обслуживании!

Мне просто интересно, насколько эффективен второй синтаксис, так как мне нужно много использовать его в цикле рендеринга (60 раз в секунду) для игры.

У тебя есть подсказка?

3 ответа

Решение

Первый (стандартный цикл for) работает намного лучше в соответствии с этим тестом.

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

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

Вообще говоря, for..of будет медленнее, чем for(;;)Зацикливание массива. Потому что он имеет дело с Итераторами / Генераторами, и это влечет за собой некоторые накладные расходы в отличие от увеличения переменной и сравнения ее с некоторым другим значением.

НО, и, как вы можете видеть, это большой, но

  1. Не преждевременно оптимизируйте код. Напишите код, проверьте, где ваши фактические узкие места, и начните их оптимизировать.

  2. Благодаря оптимизации кода микробенчмарки бесполезны. Они проверяют производительность самого теста; не методы, которые вы пытаетесь сравнить. Производительность может изменяться на несколько порядков в любом направлении при применении методов в вашем действующем производственном коде. И это на самом деле означает каждый случай. в одном месте for(;;) цикл может быть быстрее, где-то еще for..of может быть лучше.

За время работы в AS3 я узнал, что вызовы функций стоят дорого, ключ к оптимизации кода - встраивание. В JS я регулярно вижу Array#forEach обойти ручной цикл, когда JS может оптимизировать выход из функции, выполняемой в Array +, может определить, что он может избавиться от всех функций безопасности (которые должны выполняться негласно), поскольку этот код не будет вызываться с разреженным массивом или каким-либо другим способом получить доступ к неопределенному ключу в этом массиве.

Резюме:

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

А в JS внутренний оптимизатор - это ключ к действительно быстрому коду. Не некоторые микрооптимизации, которые вы применяете к своему коду.

Другие вопросы по тегам