Обращение к несуществующему элементу массива значительно снижает производительность

Сделанное наблюдение – обращение к несуществующему элементу массива, значительно снижает производительность. Это заметно на длинных петлях. Почему так происходит?

Пример:

  • Переносимость nextElementSibling / nextSibling
  • Когда использовать setAttribute vs .attribute = в JavaScript?
  • Приостановка анимации CSS с помощью javascript, а также переход в определенное место в анимации
  • Bower, регистрирующий локальный пакет git
  • Есть ли что-то вроде «непосредственных событий» в Javascript?
  • Установка пределов значения CSS для анимации прокрутки окна
  • var filledArray = []; //This array will filled var emptyArray = []; //This array leave empty //fill one array for(var i = 0; i < 1e6; i++) { filledArray[i] = true; } //Just iterate the array and call its elements //In filled array all elements exists, in empty array non-exists function callItems(arr) { for(var i = 0; i < 1e6; i++) { arr[i]; } } //measurement function function bench(f, d) { var start = new Date; f(d); alert(new Date - start, ' ms'); } ////Result for filled array //Firefox 24.0: 20 ms //Chrome 30.0: 3 ms bench(callItems, filledArray); ////Result for empty array //Firefox 24.0: 340 ms //Chrome 30.0: 70 ms bench(callItems, emptyArray); 

    Редактировать:
    Если вы используете код в Firefox, обратите внимание, что в результате Firefox влияет на Firebug – включил или отключил его. Я понял это после различных тестов.
    Если он включен – результаты такие же, как я написал выше. Но если Firebug не включен после запуска Firefox – время равное 2ms (что быстрее, чем Opera и Chrome), и разница между пустым / заполненным массивом исчезает.
    Также влияют на результаты swap calls функция bench () – сначала с пустым, затем с заполненным массивом (только в Firefox с включенным Firebug, без Firebug и в других версиях браузеров без изменений).

    Почему это влияет на Firebug? – дополнительный вопрос.

    One Solution collect form web for “Обращение к несуществующему элементу массива значительно снижает производительность”

    Это, скорее всего, потому, что механизм JavaScript выделяет пространство для элементов от 0 до i в пустом массиве. Когда массив заполняется, JS-движок просто обращается к элементу и возвращает его значение. В пустом случае двигатель готовится к тому, чтобы значение было задано в этом месте в массиве, что требует выделения пространства для этого элемента.

    Запустив код примера в Chrome 30 с открытым диспетчером задач, я наблюдал всплеск на 10 тысяч в памяти при использовании страницы на втором этапе (итерация по пустому массиву). Это пространство было быстро освобождено после того, как двигатель понял, что пространство не используется.

    JavaScript делает сайт умным, красочным и простым использованием.