为什么没有比使用默认值更快

Why isn't if else faster than using a default value?

本文关键字:默认值 为什么      更新时间:2023-09-26

如果我们有两种分配此变量的方法,要么

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是我最流利的语言,因此创建了这个jsperf,并且似乎两种变体的速度大致相同。为什么?

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

如果你对这种行为有一个解释,其他语言的例子与此相矛盾,或者我的jsperf只是错误,我会对此非常感兴趣。

让我们在设置中放置与此测试无关的所有可能需要任何时间的内容:

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;
//------------------------

这是结果。在这种情况下,if/else 等价于 ?:,并且双赋值方法确实明显变慢,因为这是您唯一要做的事情。另请注意,这是 Chrome 和其他浏览器的结果可能有所不同:

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

它可能不会对实际代码产生太大影响 - 事实上,即使只是在其他测试中处理字符串的开销,差异也几乎微不足道。

请摆脱基准测试中的随机化:你怎么知道所有的数学随机是真还是假?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)