哪个更高性能:一次调用array.prototype.push所有元素或推送每个元素一次?

时间:2013-05-07 07:40:30

标签: javascript arrays

即。比较以下两个函数:

var e1 = {a:1};
var e2 = {b:2};
var e3 = {c:3};

var test1 = function() {
    var a = [];
    a.push(e1, e2, e3);
};

var test2 = function() {
    var a = [];
    a.push(e1);
    a.push(e2);
    a.push(e3);
};

是否有更高性能的人或者他们在这方面是否相同?

编辑:我问的原因是我正在使用广泛使用第二种方法的第三方库,我怀疑是因为它需要优化,因为它没有不要让代码更具可读性。

3 个答案:

答案 0 :(得分:1)

使用一种天真的方法衡量表现,似乎使用'test2'方法稍快一点:

var e0 = {a:1};
var e1 = {a:1};
var e2 = {a:1};
var e3 = {a:1};
var e4 = {a:1};
var e5 = {a:1};
var e6 = {a:1};
var e7 = {a:1};
var e8 = {a:1};
var e9 = {a:1};
var ref = [e0,e1,e2,e3,e4,e5,e6,e7,e8,e9];

var test1 = function() {
    var a = [];
    a.push(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9);
};

var test2 = function() {
    var a = [];
    a.push(e0);
    a.push(e1);
    a.push(e2);
    a.push(e3);
    a.push(e4);
    a.push(e5);
    a.push(e6);
    a.push(e7);
    a.push(e8);
    a.push(e9);
};

function t1 () {
    var tStart = new Date().valueOf();
    for (var i = 0; i < 100000; i++) {
        test1()
    }
    var tEnd = new Date().valueOf();
    var tDelta = tEnd - tStart;

    console.log(tDelta);        
}

function t2 () {
    var tStart = new Date().valueOf();
    for (var i = 0; i < 100000; i++) {
        test2()
    }
    var tEnd = new Date().valueOf();
    var tDelta = tEnd - tStart;

    console.log(tDelta);        
}

console.log('t1'); t1();
console.log('t2'); t2();

输出:

t1
483
t2
523

然而,'test1'方法更具可读性,IMO。我个人会因为这个而使用这种方法,因为我一般不担心javascript数组的性能。

编辑:确实我忘记了t2函数中的一个元素。修改了测试和结果。似乎更易读的形式也略微(微不足道)更快。

答案 1 :(得分:1)

JavaScript本身的函数调用通常更快,因为这样可以在引擎本身中执行大部分工作。

jsperf可以了解可以实现哪种效率。

请注意,这当然是一个非常孤立的案例,所以当最终无关紧要时不要感到惊讶:)

<强>更新

有趣的是,Firefox显示了不同的结果;多个push语句执行得更快。我不确定为什么会这样。

答案 2 :(得分:1)

实际答案是 - 就所有意图和目的而言,它们是相同的。除非您的程序仅包含将元素推送到数组中,否则您不可能在这些方法中看到任何明显的性能差异。

因此,您应该为阅读源代码的人选择最自然,易懂和可维护的那些。

(对于任何其他与性能相关的问题也是如此。编写明智的代码,只有在您测量到特定代码块导致您的不良延迟时才进行优化申请作为一个整体。)