我想知道在以下情况下做案例B与案例A(反之亦然)是否有任何速度优势:
bool test1(){
// Check something, return true/false
}
bool test2(){
// Check something, return true/false
}
案例A
if(test1() && test2()){
//execute XYZ
}
案例B
if(test1()){
if(test2()){
//execute XYZ
}
}
我的意思是,如果test1()
和test2()
中涉及的例程需要一些时间来执行,那么直觉上有些人可能会认为案例B可能会运行得更快,因为test2()
只能获得如果测试1为真,或者编译器足够聪明,在案例A的逻辑序列中确定test1(...)
失败,那么test2(...)
不需要检查?
也许上述内容相同,有人可以告诉我......
答案 0 :(得分:10)
is the compiler smart enough to determine
是的,这称为Short-circuit evaluation,适用于&&
,||
和?
运算符(除非您重载它们),如在第5.14,5.15和5.16段的标准中描述。
答案 1 :(得分:4)
它们是等效的,如果test1
返回false,则在这两种情况下都不会执行test2
。
答案 2 :(得分:2)
在这两种情况下,如果测试1为假,则不会执行测试2。在这方面,它们完全相同。
案例A优先于案例B以提高可读性。您可以在一行中看到两者都必须为true,并且通过排序可以看到首先检查测试1。
答案 3 :(得分:1)
例如,在java中,如果答案已经存在,他可以避免一些测试。我现在没有太多时间来测试这个案子。但是你可以轻松测试,在test2()上做一个非常慢的rotine并在test1()上给出一个antecipate答案。然后,如果快速回答。 C ++的工作方式与Java类似。
在您的示例中,如果test1()的返回值为false,则只有您具有antecipate答案。换句话说,test2()是必需的。
如果你可以等,我今晚将测试这个案例。
答案 4 :(得分:-3)
if ($(this).val() == 'sub-cat-one')
跑得更快,这是证明它的两个原因。
1.对于Case A
,&&
逻辑运算符等short-circuit evaluate ||
,因此Case A
可能比Case B
2. if
语句将翻译为jmp
汇编语言,执行时间更长。因此Case B
的费用将超过Case A
。