假设我们有一个对象,我们需要验证以下内容 -
我们有两种可能的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;
}
哪一个会更快?提前谢谢。
答案 0 :(得分:2)
一般来说,这两种形式是等价的,一个体面的编译器可能会将它们编译成相同的最终组件。当然,您应该检查您的特定编译器。您可以在这里查看一些编译器的汇编输出以解决您的问题:
例如,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个,无论哪个条件失败。