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

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

Пример:

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? – дополнительный вопрос.

  • Почему JSHint бросает предупреждение, если я использую const?
  • Как загрузить скриншот с помощью html2canvas?
  • Карта над ключами сохранения объектов
  • Поддержка IE для DOM importNode
  • JSON Stringify изменяет время выполнения из-за UTC
  • Uncaught TypeError: не может использовать оператор 'in' для поиска 'length' в
  • Является ли getElementByClass безопасным для использования в браузерах, таких как getElementById?
  • Дезинфекция PHP XSS
  • One Solution collect form web for “Обращение к несуществующему элементу массива значительно снижает производительность”

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

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

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