0

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

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 可能只是错误的,我会对此非常感兴趣。

4

2 回答 2

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

是结果在这种情况下,if/else 与 ?: 等价,并且考虑到这是你唯一要做的事情,两次赋值方法确实明显变慢了。另请注意,这是 Chrome 的结果,其他浏览器可能会有所不同:

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

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

于 2013-10-24T17:36:01.933 回答
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)
于 2013-10-24T18:11:54.243 回答