Обращение к несуществующему элементу массива значительно снижает производительность
Сделал наблюдение - обращение к несуществующему элементу массива очень сильно снижает производительность. Это заметно на длинных петлях. Почему так происходит?
Пример:
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 - время равно 2 мс (что быстрее, чем у Opera и Chrome) и разница между пустым / заполненным массивом исчезает.
Также влияют на результаты подкачки вызовы функции bench () - сначала с пустым, затем с заполненным массивом (только в Firefox с включенным Firebug, без Firebug и в других браузерах результаты не изменяются).
Почему такое влияет Firebug? - дополнительный вопрос.