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

时间:2013-02-01 18:12:58

标签: 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);
        }
        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

屏幕截图:enter image description here

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

更新:我尝试了本地Firefox控制台中的脚本,这些数字是我首先想到的:使用本地数组优于使用对象数组。因此,真正的原因是Firebug由于某种原因使数字偏斜并显示不正确的结果。要记住的事情。

1 个答案:

答案 0 :(得分:1)

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

但最重要的是,在等待的时候,两个测试在FF / Safari上执行相同的操作......

您可以从中得出的唯一结论是:两种方法都执行相同的操作。

但是,因为任何人分配了很多&#39;堆&#39;无论如何都会使用简单的myArray [lastIndex-1] = 0进行分配,我担心真正的结论是:这个测试没有显示任何内容。