为什么没有比使用默认值更快
Why isn't if else faster than using a default value?
如果我们有两种分配此变量的方法,要么
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)
相关文章:
- 我的shareService在angular 2中发送值工作正常,但当我渲染我的另一个组件时,会获得默认值
- jquerydatetimepicker日期和时间应在框默认值中,而无需单击框
- 如果值为空,如何设置输入的默认值?jQuery
- 骨干模型默认值-todos.js示例中不必要的代码
- jquery日期选择器年份范围默认值
- Html5输入属性的默认值,如最小值、最大值、大小等
- 根据两个下拉列表的默认值禁用按钮
- 如何创建具有默认值的JavaScript对象字段?(AngularJS模型相关)
- Angularjs-设置不带ng选项的select的默认值
- jQuery Datepicker从日期开始设置默认值
- 如何设置浏览器打开的文件对话框的文件名(一些默认值)
- 我可以通过使用函数绑定来保留默认值吗?如果没有,为什么
- jQuery Mobile - 为什么将默认值绑定到 mobileinit
- 为什么没有比使用默认值更快
- 为什么不将 jQuery UI 日期选择器的默认值设置为匿名函数
- 为什么使用时出现“意外的”.“||运算符,以表示括号中的默认值
- 为什么闭包函数中的 javascript 变量在多次调用时不会重置为默认值
- 为什么我的模式不能在mongoose数组中添加默认值?
- 为什么表单提交默认值被删除?
- 为什么在我的javascript中设置参数的默认值不工作