Javascript 性能:在对象命名空间中使用数组与本地数组

Javascript 性能:在对象命名空间中使用数组与本地数组,javascript,performance,firebug,Javascript,Performance,Firebug,我在玩一些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); } ret

我在玩一些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');
截图:

我一直认为在函数中使用本地定义的对象更快,但这个实验表明我错了。为什么会发生这种情况


更新:我在本地Firefox控制台中尝试了这个脚本,结果是我首先想到的:使用本地数组的性能优于使用对象数组。所以真正的原因是Firebug,它由于某种原因扭曲了数字并显示了错误的结果。要记住的东西

与魔法一样,魔法在于相信它正在发生的人的眼睛。
顺便问一下,你在这里测试什么?如果我们忘记了,在doLoopObject中,您不会返回this.obj,只需测试几次,结果就会是“随机的”,更糟糕的是:如果您颠倒测试顺序,它们可能会根据浏览器的不同而变化。 结果将取决于您在两次单击之间等待的时间。如果您等待几秒钟,它们将始终几乎相等。
现在请注意,在JSPerf上,数字增长的速度,特别是在Firefox上,解释变得非常明显:有周期性的减速:垃圾收集器是由这些垃圾创建函数触发的。当它触发时,数字将缓慢增加,可能是对象或局部变量(这无关紧要)。 这里测量的是垃圾收集器时间,而不是与局部变量相比对象属性的push()时间。这就解释了为什么顺序和测试之间的时间会改变事情。
我要补充的是,两次测试之间的变化太大,无法得出任何结论

但最重要的是,当等待时间足够长时,两个测试在FF/Safari上执行相同的测试

从所有这些中,您可以得出的唯一结论是:两种方法的性能相同


但是,由于任何分配这么多“堆”的人都会使用简单的myArray[lastIndex-1]=0立即进行分配,因此我担心真正的结论是:此测试没有显示任何结果

我用chrome将这段代码粘贴到我的控制台上,本地数组用了2毫秒,对象数组用了3毫秒。。有趣。如果您交换了顺序,运行本地第二个呢?我刚刚在Chrome中也运行了这个,第一次得到:“使用本地数组:1.675ms使用对象数组:3.585ms”。重复同样的代码三次后,我得到“使用本地数组:2.316ms使用对象数组:1.673ms”。更有趣的是。。。这里的jsperf写我的代码太慢了,试图将代码简化为有趣的部分。@我尝试了本地Firefox控制台的系统,你知道吗?现在的数字更具可比性了,它甚至表明本地的速度更快。这很奇怪。所以看起来是Firebug把结果搞砸了。我早该知道的。
Using Local array: 16ms
Using Object array: 2ms