2

即比较以下两个函数:

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 方库,我怀疑这是因为希望优化,因为它没有使代码更具可读性。

4

3 回答 3

1

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

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

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

更新

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

于 2013-05-07T08:40:05.517 回答
1

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

因此,您应该选择对阅读源代码的人来说最自然、最容易理解和最易于维护的那个。

(对于任何其他与性能相关的问题也是如此。编写合理的代码,并且只有在您测量到特定代码块会导致整个应用程序出现不良延迟时才进行优化。)

于 2013-05-07T08:44:41.373 回答
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

但是,IMO 的“test1”方法更具可读性。就我个人而言,我会使用这种方法,因为我通常不担心 javascript 数组的性能。

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

于 2013-05-07T08:00:07.903 回答