OR语句比多个IF语句更快吗?

Aar*_*ron 1 delphi optimization performance logic

假设我有一些像这样的代码:

if (ItemA = nil) then
  Exit;
if (ItemB = '') then
  Exit;
Run Code Online (Sandbox Code Playgroud)

这样做会更快/更有效率:

if (ItemA = nil) or (ItemB = '') then
  Exit;
Run Code Online (Sandbox Code Playgroud)

我意识到这很可能不会影响性能,但我只是好奇.

Dav*_*nan 6

他们是一样的.这是我的测试程序:

{$APPTYPE CONSOLE}

var
  i, j: Integer;

begin
  if (i=0) then
    Exit;
  if (j=0) then
    Exit;
  if (i=0) or (j=0) then
    Exit;
  Writeln('stop the compiler optimising away the final exit');
end.
Run Code Online (Sandbox Code Playgroud)

并使用32位编译器从发布版本编译代码:

Project1.dpr.9: if (i=0) then
004060D5 85DB             test ebx,ebx
004060D7 7426             jz $004060ff
Project1.dpr.11: if (j=0) then
004060D9 85C0             test eax,eax
004060DB 7422             jz $004060ff
Project1.dpr.13: if (i=0) or (j=0) then
004060DD 85DB             test ebx,ebx
004060DF 741E             jz $004060ff
004060E1 85C0             test eax,eax
004060E3 741A             jz $004060ff

并从64位编译器:

Project1.dpr.9: if (i=0) then
000000000040B49F 833D2A78000000   cmp dword ptr [rel $0000782a],$00
000000000040B4A6 743B             jz Project1 + $63
Project1.dpr.11: if (j=0) then
000000000040B4A8 833D2578000000   cmp dword ptr [rel $00007825],$00
000000000040B4AF 7432             jz Project1 + $63
Project1.dpr.13: if (i=0) or (j=0) then
000000000040B4B1 833D1878000000   cmp dword ptr [rel $00007818],$00
000000000040B4B8 7429             jz Project1 + $63
000000000040B4BA 833D1378000000   cmp dword ptr [rel $00007813],$00
000000000040B4C1 7420             jz Project1 + $63

如您所见,两个Windows编译器都为这两种变体生成相同的代码.我不能保证移动编译器,但如果他们有任何不同,我会感到震惊.

随意使用哪个感觉更容易阅读!

请注意,如果启用完整的布尔评估选项(文档链接1,文档链接2),那么事情当然会改变.输出现在是:

Project1.dpr.9: if (i=0) then
004060D4 85C0             test eax,eax
004060D6 742B             jz $00406103
Project1.dpr.11: if (j=0) then
004060D8 85D2             test edx,edx
004060DA 7427             jz $00406103
Project1.dpr.13: if (i=0) or (j=0) then
004060DC 85C0             test eax,eax
004060DE 0F94C0           setz al
004060E1 85D2             test edx,edx
004060E3 0F94C2           setz dl
004060E6 0AC2             or al,dl
004060E8 7519             jnz $00406103

我认为完全布尔评估显然会导致代码变慢.当然,完整的布尔评估是一个极端的案例,因为我很惊讶找到任何使用它的场景.当然,在测试表达式有副作用的情况下,它与代码的两个if语句版本在逻辑上是不同的.