什么更快?两次比较或一次比较与一次逻辑检查?

时间:2015-11-07 20:45:47

标签: javascript performance

好的,我正在筑巢验证,如果我已经对性能有所了解。

假设我正在验证演出门票,我可以这样做:

var validateVipTicket = function (ticketInfo) {
  if (ticketInfo.isPaid) {
    if (ticketInfo.isOver16) {
      if (ticketInfo.isVip) {
        return true;
      } else return 'Not Vip';
    } else return 'Not old enought';
  } else return 'Need to pay first';
};

并将其称为validateVipTicket({isPaid: true, isOver16: true, isVip: true});

BUT 让我们假设指出发生了什么错误并不重要,我只想要一个真或假,那么,什么方法会更快?

if (ticketInfo.isPaid) {
  if (ticketInfo.isOver16) {

if (ticketInfo.isPaid && ticketInfo.isOver16) {

第一种情况上,将检查第一个属性,完成后,将检查第二个属性。在第二种情况上,将检查第一个属性,将检查第二个属性,并且两个属性将相互比较。这是正确的吗?我错过了什么吗?哪个更快,为什么?

4 个答案:

答案 0 :(得分:2)

  

在第二种情况下,将检查第一个属性,第二个属性   将检查属性,并将它们两个属性进行比较   互相攻击。这是对的吗?

不,那实际上不对。 &&运算符执行short-circuit evaluation,这意味着如果第一个操作数的计算结果为false,则永远不会计算第二个操作数。

这使得两种方法完全等效(即使评估oparands有任何副作用)。由于它们以相同的方式完成相同数量的工作,因此您可以预期性能非常相似。甚至可能这些方法最终会生成相同的可执行代码。

答案 1 :(得分:1)

这两个陈述在表现方面是等同的。在这两种情况下,仅当第一次检查(ticketInfo.isOver16)返回true时,才会评估第二次检查(ticketInfo.isPaid)。这两种说法在速度方面完全相同。所以你应该更喜欢那个对你更具可读性的那个。

答案 2 :(得分:1)

没有区别:

if ( a && b )

相同
if ( a )
   if ( b )

对于a && b,如果发现a为false,那么b是什么并不重要。

在两种情况下,CPU指令级别会发生什么:

cmp   [a], 0    ; a == 0?  (it does this by calculating a - 0)
jz    false1    ; jump if result is zero
; a is true
cmp   [b], 0
jz    false2
; both a and b are true

是否返回3个不同的消息,或者只返回1,可能会对速度产生影响,具体取决于编译方式。在这个例子中,没有区别:

false1:  return "not a!";
false2:  return "not b!";

just_false: return false;

但是在这里,需要额外的跳跃/转到:

false1:  result = "not a!"; goto done;
false2:  result = "not b!"; // goto done optimized away
done: return result;

答案 3 :(得分:1)

现代JS引擎(如V8)的性能将是相同的。尽管蹩脚的解释器总是有可能比另一个更好,但是使用现代浏览器和J8编译器(如V8),您应该得到相同的结果。

概念证明: http://jsperf.com/nested-conditionals-vs-inline