Подтвердить что ты не робот

Почему собственный массив javascript для метода Each значительно медленнее, чем стандарт для цикла?

Читая исходный код для игрового движка Quintus, я обнаружил, что они интенсивно используют циклы, а не для native forEach.

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

После того, как тыкаешься, я не могу понять, что происходит под капотом. Кто-нибудь знает причину огромной разницы?

EDIT: Чтобы быть ясным, я спрашиваю, почему это так. Я не спрашиваю "что быстрее".

4b9b3361

Ответ 1

InEach включает в себя множество проверок внутри и не так прямо, как простой цикл.
Подробнее см. ссылку на Javascript для Mozilla:

if (!Array.prototype.forEach)
{
  Array.prototype.forEach = function(fun /*, thisArg */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== "function")
      throw new TypeError();

    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++)
    {
      if (i in t)
        fun.call(thisArg, t[i], i, t);
    }
  };
}

Ответ 2

спасибо за вставку реализации; там ответ прямо там: fun.call медленнее, чем fun, а тест i in t стоит дорого.

Кажется, что он так старался решать необычные случаи что конечный результат слишком дорог для общего использования.