Javascript 对阵列中不存在的元素的吸引,大大降低了性能

Javascript 对阵列中不存在的元素的吸引,大大降低了性能,javascript,firefox,firebug,Javascript,Firefox,Firebug,对阵列中不存在的元素做了一个观察-吸引,大大降低了性能。它明显地在长的环上。为什么会这样 例如: 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

对阵列中不存在的元素做了一个观察-吸引,大大降低了性能。它明显地在长的环上。为什么会这样

例如:

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);
var filledaray=[]//此数组将被填充
var emptyArray=[]//此数组保留为空
//填充一个数组
对于(变量i=0;i<1e6;i++){
filledaray[i]=真;
}
//只需迭代数组并调用其元素
//在填充数组中所有元素都存在,在空数组中不存在
函数调用项(arr){
对于(变量i=0;i<1e6;i++){
arr[i];
}
}
//测量功能
功能台(f、d){
var开始=新日期;
f(d);
警报(新日期-开始,“ms”);
}
////填充数组的结果
//Firefox 24.0:20毫秒
//铬30.0:3毫秒
工作台(卡尺、填充阵列);
////空数组的结果
//Firefox 24.0:340毫秒
//铬30.0:70毫秒
工作台(卡利腾、空雷);
编辑:
如果您在Firefox中运行代码,请注意on会导致Firefox影响Firebug–启用或禁用它。经过各种测试,我明白了。
如果它被启用,结果是一样的,我是如何写上面的。但如果Firefox启动后Firebug未启用,则时间等于2ms(比Opera和Chrome快),空/满阵列之间的差异消失。
还影响结果交换调用函数bench()–首先使用空数组,然后使用填充数组(仅在启用Firebug的Firefox中,不使用Firebug,以及在其他浏览器中结果不变)


为什么这样会影响萤火虫附加问题。

这很可能是因为JavaScript引擎正在为空数组中的元素
0
i
分配空间。当数组被填充时,JS引擎只需访问元素并返回其值。在空的情况下,引擎准备在数组中的该位置设置一个值,这需要为该元素分配空间


在任务管理器打开的情况下在Chrome30中运行示例代码,在第二步(在空数组上迭代)中,我观察到页面内存使用量出现了10k峰值。当引擎意识到空间未被使用时,该空间很快被释放。

如果在对象本身上找不到属性,引擎必须在
[[Prototype]]
链(Array.Prototype->object.Prototype->null)上搜索该属性。也许这就是区别,没错!我怀念这一刻。最有可能的原因是这样的行为。谢谢