C ++速度和逻辑流

时间:2015-08-18 11:31:48

标签: c++ performance if-statement optimization

我想知道在以下情况下做案例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(...)不需要检查?

也许上述内容相同,有人可以告诉我......

5 个答案:

答案 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