好的,我正在筑巢验证,如果我已经对性能有所了解。
假设我正在验证演出门票,我可以这样做:
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) {
在第一种情况上,将检查第一个属性,完成后,将检查第二个属性。在第二种情况上,将检查第一个属性,将检查第二个属性,并且两个属性将相互比较。这是正确的吗?我错过了什么吗?哪个更快,为什么?
答案 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),您应该得到相同的结果。