哪个if语句执行得更快?

时间:2014-09-23 10:22:11

标签: performance algorithm theory

假设我们有一个对象,我们需要验证以下内容 -

  • 对象 - >文本长度大于0
  • 对象 - > dummy不为空
  • Objecct-> dummy2存在于另一个对象

我们有两种可能的if语句:

if(greaterThan(Object->text, 0) && 
   exists(Objet->dummy) && 
   inObject(Object->dummy2, Objet2))

第二个如果:

if(!greaterThan(Object->text, 0) || 
       !exists(Objet->dummy) || 
       !inObject(Object->dummy2, Objet2)) {
  NOP  
 } else {
   //Do something;
}

哪一个会更快?提前谢谢。

2 个答案:

答案 0 :(得分:2)

一般来说,这两种形式是等价的,一个体面的编译器可能会将它们编译成相同的最终组件。当然,您应该检查您的特定编译器。您可以在这里查看一些编译器的汇编输出以解决您的问题:

http://goo.gl/FeSmEa

例如,gcc 4.9输出:

void function1() {
  if (greaterThan() &&  exists() && inObject()) {
    result = 42;
  }
}

给出:

function1():
    sub rsp, 8
    call    greaterThan()
    test    eax, eax
    jne .L13
.L1:
    add rsp, 8
    ret
.L13:
    call    exists()
    test    eax, eax
    je  .L1
    call    inObject()
    test    eax, eax
    je  .L1
    mov DWORD PTR result[rip], 42
    jmp .L1

而另一种变体:

void function2() {
  if (!greaterThan() ||  !exists() || !inObject()) {
    // NOP
  } else {
    result = 42;
  }
}

导致相同的装配:

function2():
    sub rsp, 8
    call    greaterThan()
    test    eax, eax
    jne .L28
.L14:
    add rsp, 8
    ret
.L28:
    call    exists()
    test    eax, eax
    je  .L14
    call    inObject()
    test    eax, eax
    je  .L14
    mov DWORD PTR result[rip], 42
    jmp .L14

在所有情况下,编译器为两个选项生成相同的程序集(我通过删除一些参数来略微简化它,但这应该是无关紧要的。)

答案 1 :(得分:-2)

使用逻辑AND(&&)会更快。原因是如果你需要满足所有3个条件,并且即使其中1个条件失败,它也会忽略检查其余条件。或者将检查所有3个,无论哪个条件失败。