为什么不是比使用默认值更快?

时间:2013-10-24 17:24:41

标签: javascript performance

如果我们有两种方法来分配这个变量,那么

if(condition){
  var a = "Condition is true";
} else {
  var a = "Condition is false";
}

var a = "Condition is false";
if(condition){
  a = "Condition is true";
}

我个人原本期望前者更快,考虑到变量总是只写一次而不是写入两次,并且在两种情况下都使用条件。

由于Javascript是我最流利的语言,因此创建了this jsperf,似乎两种变体大致相同。那是为什么?

  • 写入变量的成本是否很小?
  • 是否正在进行优化以使两种情况相等? (在Firefox的情况下,似乎两种情况 相等!)

如果你对这种行为有一个解释,那么与这个或者我的jsperf相矛盾的其他语言的例子就是错误的,我真的很感兴趣。

2 个答案:

答案 0 :(得分:2)

让我们在设置中放置与此测试无关的所有时间:

condition = Math.floor(Math.random()*2);
a = undefined;
trueval = "Condition is true";
falseval = "Condition is false";

现在我们的案例是:

//------------------------
//Using else
if(condition){
  a = trueval;
} else {
  a = falseval;
}
//------------------------
//Using a default value
a = falseval;
if(condition){
  a = trueval;
}
//------------------------
//Extra case for curiosity, using ?:
a = condition ? trueval : falseval;
//------------------------

here are the results。在这种情况下,如果/ else等同于?:,并且双分配方法确实明显慢于,因为这是您正在做的唯一事情。另请注意,这是Chrome和其他浏览器可能不同的结果:

Using else:            42,623,032
Using a default value: 35,654,982
Using ?::              42,206,645

它可能不会对实际代码产生太大影响 - 实际上,即使只是在另一个测试中处理字符串的开销也使差异几乎无关紧要。

答案 1 :(得分:1)

请摆脱基准测试中的随机化:你怎么知道所有数学范式是真还是假? 极不可能* 100个样本给予50个真实和虚假。

试试这个:http://jsperf.com/else-vs-defaule-value/5

*例如,使用100次基准测试模拟100个样本:

var totals = new Array(100)
var a = new Array(100)

for (var j = 0; j < 100; ++j) {
    for (var i = 0; i < 100; ++i) {
        a[i] = !! Math.floor(Math.random() * 2);
    }
    totals[j] = a.filter(Boolean).length;
}

//Running the jsperf 100 times and only X were "fair" (had same amount of true as false)
console.log(totals.filter(function(v){return v === 50}).length)