gpt4 book ai didi

performance - OR 语句是否比多个 IF 语句更快?

转载 作者:行者123 更新时间:2023-12-03 19:08:03 24 4
gpt4 key购买 nike

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

if (ItemA = nil) then
Exit;
if (ItemB = '') then
Exit;

这样做会更快/更有效吗:
if (ItemA = nil) or (ItemB = '') then
Exit;

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

最佳答案

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

{$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.

以及来自使用 32 位编译器的发布版本的编译代码:

Project1.dpr.9:如果(i=0)那么
004060D5 85DB 测试 ebx,ebx
004060D7 7426 jz $004060ff
Project1.dpr.11:如果(j=0)那么
004060D9 85C0 测试 eax,eax
004060DB 7422 jz $004060ff
Project1.dpr.13:如果 (i=0) 或 (j=0) 那么
004060DD 85DB 测试 ebx,ebx
004060DF 741E jz $004060ff
004060E1 85C0 测试 eax,eax
004060E3 741A jz $004060ff

从 64 位编译器:

Project1.dpr.9:如果(i=0)那么
000000000040B49F 833D2A78000000 cmp dword ptr [rel $0000782a],$00
000000000040B4A6 743B jz 项目1 + 63 美元
Project1.dpr.11:如果(j=0)那么
000000000040B4A8 833D2578000000 cmp dword ptr [rel $00007825],$00
000000000040B4AF 7432 jz 项目1 + 63 美元
Project1.dpr.13:如果 (i=0) 或 (j=0) 那么
000000000040B4B1 833D1878000000 cmp dword ptr [rel $00007818],$00
000000000040B4B8 7429 jz 项目1 + 63 美元
000000000040B4BA 833D1378000000 cmp dword ptr [rel $00007813],$00
000000000040B4C1 7420 jz 项目1 + 63 美元

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

请随意使用任何感觉更容易阅读的东西!

请注意,如果您启用完整的 bool 评估选项( doc link 1doc link 2 ),那么事情当然会改变。现在的输出是:

Project1.dpr.9:如果(i=0)那么
004060D4 85C0 测试 eax,eax
004060D6 742B jz $00406103
Project1.dpr.11:如果(j=0)那么
004060D8 85D2 测试 edx,edx
004060DA 7427 jz $00406103
Project1.dpr.13:如果 (i=0) 或 (j=0) 那么
004060DC 85C0 测试 eax,eax
004060DE 0F94C0 塞茨阿尔
004060E1 85D2 测试 edx,edx
004060E3 0F94C2 setz dl
004060E6 0AC2 或 al,dl
004060E8 7519 jnz $00406103

我认为很明显,完整的 bool 评估会导致代码变慢。当然,完整的 bool 评估是一种极端情况,因为我会惊讶地发现任何使用它的场景。当然,如果被测试的表达式有副作用,它在逻辑上与你的两个 if 语句版本的代码是不同的。

关于performance - OR 语句是否比多个 IF 语句更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20549355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com