如果我们有两种方法来分配这个变量,那么
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,似乎两种变体大致相同。那是为什么?
如果你对这种行为有一个解释,那么与这个或者我的jsperf相矛盾的其他语言的例子就是错误的,我真的很感兴趣。
答案 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)