Используя контрольный пример
bool invalid();
bool dont_execute();
void execute();
bool foo()
{
if(invalid())
return false;
if(dont_execute())
return false;
execute();
return true;
}
bool foo2()
{
if(invalid() || dont_execute() /* || .. etc */)
return false;
execute();
return true;
}
, вы можете увидеть, что и foo
, и foo2
скомпилированы в одну и ту же сборку как G CC 9.2, так и Clang 9 с оптимизацией -O2
флаги см. Годболт . Например, вывод G CC равен
foo():
sub rsp, 8
call invalid()
test al, al
je .L2
.L4:
xor eax, eax
add rsp, 8
ret
.L2:
call dont_execute()
test al, al
jne .L4
call execute()
mov eax, 1
add rsp, 8
ret
foo2():
sub rsp, 8
call invalid()
test al, al
je .L8
.L10:
xor eax, eax
add rsp, 8
ret
.L8:
call dont_execute()
test al, al
jne .L10
call execute()
mov eax, 1
add rsp, 8
ret
Хотя это не означает, что никогда не будет разницы, по крайней мере компиляторы не думают, что они должны это делать что-то различное в этих двух случаях, даже если они не знают, что делают вызываемые функции.
Поэтому я предлагаю вам не беспокоиться о производительности, а go о том, что вы считаете более читабельным.