哪一个更快[if(x或y)]或[if if else if y]

时间:2011-12-19 10:21:27

标签: javascript performance

我需要检查用户写的日期是否有效,所以我想知道什么会更快?

if(dayOfManth > 12 || dayOfManth < 1) { return false; }
return true;

if(MonthOfYear > 12) { return false; }
if(MonthOfYear < 1)  { return false; }

return true;

DayOfMonth(1-31)和其他人(年份范围,短月,FEB闰日等)也是如此。

什么会更快?

5 个答案:

答案 0 :(得分:5)

只需使用:

return dayOfMonth >= 1 && dayOfMonth <= 12

这是最具可读性的。在这种情况下,性能可以忽略不计。不要微观优化。

答案 1 :(得分:2)

正如您对问题的评论已经说过,表现不应该是一个问题。所以可读性应该是王道。

根据您对问题的评论:

  

有很多检查,因此无法读取

然后我建议您使用这样的选项来拆分布尔表达式:

function someFunction(dayOfMonth, someOtherValue) {
    var result = true;
    result &= dayOfMonth >= 1;
    result &= dayOfMonth <= 12;
    result &= someOtherValue == 6;
    return result;
}

alert(someFunction(7, 6) ? "true" : "false"); // true
alert(someFunction(13, 6) ? "true" : "false"); // false
alert(someFunction(7, 5) ? "true" : "false"); // false

这使用布尔&=运算符来表示“如果结果仍为真,且此表达式也为真,则将结果设置为true。否则将其设置为false”。

除了性能之外,这将允许你将所有表达式分开,但仍然让它们可读,并让你尽可能避免重复自己。

为了便于阅读,我仍然会在有意义的时候组合表达式,而不是在每一行上放置一个表达式。我这里只是为了演示它是如何工作的。

答案 2 :(得分:0)

始终选择更能表达您意图的选项。在这种情况下,我发现第一个比第二个更清晰,尽管这是主观的。

除此之外,我还会使用一些表格验证框架,这样你就不必重新发明轮子了。

修改

从未尝试过,但看起来很有希望: http://docs.jquery.com/Plugins/Validation

答案 3 :(得分:0)

如果这是用户输入验证,那么这种微优化就不会引人注意,你应该像其他人所建议的那样努力获得代码可读性和可维护性。

现在回答你的问题。我不相信有任何区别。我希望唯一可能的优化(在X86架构上,对其他人来说不能说)是你是否可以在不使用条件跳转的情况下编译逻辑表达式,从而避免不必要的branch mispredictions。我不认为这可以做到,因为你正在使用比较。如果您有兴趣了解有关此类优化的更多信息,我衷心建议您阅读Intel® 64 and IA-32 Architectures Optimization Reference Manual

答案 4 :(得分:0)

它们完全相同。这似乎是短路评估的错误案例 [Wikipedia]

JavaScript使用(实际上只有)短路评估 - 如果第一个操作数返回所需的最小条件:

合乎逻辑的OR:

true || (true/false) - 只需要第一个做真正的短路(最佳方案);

false || true - 现在评估第二个,因为第一个(最糟糕的情况);

逻辑AND:

false && (true/false) - 无论第二个是什么,结果都是错误的。第二个条件未评估(最佳方案);

true && true - 评估两者(最糟糕的情况)。

我还做了一点example - 第二个测试显示了一个额外的警报(),因为评估了第二个“条件”。