做了一个观察——吸引不存在的数组元素,大大降低了性能。它在长循环上很明显。为什么会发生?
例子:
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 - 启用或禁用它。经过各种测试,我明白了。
如果它启用 - 结果相同,我在上面写的。但是,如果在启动 Firefox 后未启用 Firebug - 时间等于 2ms(比 Opera 和 Chrome 快)并且空/填充数组之间的差异消失了。
还会影响结果交换调用函数 bench() - 首先是空数组,然后是填充数组(仅在启用 Firebug 的 Firefox 中,没有 Firebug 和其他浏览器结果不变)。
为什么这样会影响 Firebug?– 附加问题。