2013-05-07 35 views
2

I.e.比较以下两个函数:哪一个更高性能:一次调用array.prototype.push与所有元素或每个元素一次?

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); 
}; 

是否有任何一个更高性能或它们在这方面是否相等?

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

+5

转到jsperf.com并找出答案。 – Barmar 2013-05-07 07:42:01

+4

不用担心,使用第一个,它更短。微粒化是毫无意义的。 – elclanrs 2013-05-07 07:42:52

+1

一般来说,较少的函数调用可能会更好。但除非你推动数千个元素,否则差异可能会微不足道。 – Barmar 2013-05-07 07:44:05

回答

1

实际答案是 - 所有意图和目的,他们是相同的。除非您的程序仅包含将元素推入数组,否则这些方法之间的性能差异不大。

因此,您应该为阅读源代码的人选择最自然,最易于理解和可维护的版本。

(这是任何其他性能有关的问题也同样如此。写明智代码,只有优化一旦你测量的代码的特定块导致在你的应用程序不希望延迟作为一个整体)

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函数中的一个元素。修改了测试和结果。看起来更可读的形式也是略微(微不足道)更快。

+3

你在'test2()'中缺少'a.push(e0);',所以这就是为什么它更快。 – 2013-05-07 08:25:11

1

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

jsperf给出了一个想法可以达到什么样的效率。

注意,这当然是一个非常孤立的个案,所以不感到惊讶,当它不到底:)

更新

有趣的事,火狐显示了不同的结果;多个push语句执行速度更快。我不确定这是为什么。