我正在玩一些javascript性能优化,并发现了一些有趣的东西。这是代码:
function gObject() {
this.obj = [];
this.LIMIT = 100000;
this.doLoopLocal = function () {
var o = [];
for (var i=0;i<this.LIMIT;i+=1) {
o.push(i);
}
return o;
};
this.doLoopObject = function () {
this.obj = [];
for (var i=0;i<this.LIMIT;i+=1) {
this.obj.push(i);
}
};
};
var g = new gObject();
console.time('Using Local array');
g.doLoopLocal();
console.timeEnd('Using Local array');
console.time('Using Object array');
g.doLoopObject();
console.timeEnd('Using Object array');
当我运行它时,日志告诉我使用本地数组比使用对象命名空间中定义的数组慢。差异很大 - 8到10倍! (FF 18.0.1)
Using Local array: 16ms
Using Object array: 2ms
屏幕截图:
我总是假设在函数中使用本地定义的对象更快,但是这个实验表明我错了。为什么会发生这种情况?
更新:我尝试了本地Firefox控制台中的脚本,这些数字是我首先想到的:使用本地数组优于使用对象数组。因此,真正的原因是Firebug由于某种原因使数字偏斜并显示不正确的结果。要记住的事情。
答案 0 :(得分:1)
与魔术一样,魔力在于相信它正在发生的眼睛 顺便问一下,你在这里测试什么?如果我们忘记了这一点,在你的doLoopObject中,你不会返回this.obj,只是测试几次表明结果是随机的,甚至更糟:如果你颠倒了测试的顺序,他们可能会根据浏览器而改变。 结果将取决于您在两次点击之间等待的时间。如果等待几秒钟,它们将始终几乎相等 现在请注意,在JSPerf上,数字正在增长的速度,特别是在Firefox上,解释变得非常明显:存在周期性的减速:垃圾收集器由这样的垃圾创建函数触发。当它触发时,数字会增加得更慢,可能是对象或局部变量(它并不重要)。 你在这里测量的是垃圾收集器时间,而不是对象属性上的push()时间与局部变量的比较。这就解释了为什么订单和测试之间的时间会改变一切 我将补充说,两次测试之间的变化太大了,无法做出任何结论。
但最重要的是,在等待的时候,两个测试在FF / Safari上执行相同的操作......
您可以从中得出的唯一结论是:两种方法都执行相同的操作。
但是,因为任何人分配了很多&#39;堆&#39;无论如何都会使用简单的myArray [lastIndex-1] = 0进行分配,我担心真正的结论是:这个测试没有显示任何内容。