if(a<901)是否比if(a<=900)快?

与这个简单示例中的情况不同,但循环复杂代码的性能略有变化。我想这需要对生成的机器代码进行一些处理,以防它是真的。


当前回答

只有当制造计算机的人不擅长布尔逻辑的时候。他们不应该这样。

每个比较(>=<=><)都可以以相同的速度进行。

每一次比较都只是一次减法(差值),看看它是正还是负。(如果设置了msb,则数字为负数)

如何检查a>=b?Sub a-b>=0检查a-b是否为正。如何检查a<=b?Sub 0<=b-a检查b-a是否为正。如何检查a<b?Sub a-b<0检查a-b是否为负。如何检查a>b?Sub 0>b-a检查b-a是否为负。

简单地说,对于给定的操作,计算机可以在引擎盖下面执行以下操作:

a>=b==msb(a-b)==0a<=b==msb(b-a)==0a>b==msb(b-a)==1a<b==msb(a-b)==1

当然,计算机实际上也不需要执行==0或==1。对于==0,它可以将电路中的msb反相。

无论如何,他们肯定不会将a>=b计算为a>b||a==b lol

其他回答

只有当制造计算机的人不擅长布尔逻辑的时候。他们不应该这样。

每个比较(>=<=><)都可以以相同的速度进行。

每一次比较都只是一次减法(差值),看看它是正还是负。(如果设置了msb,则数字为负数)

如何检查a>=b?Sub a-b>=0检查a-b是否为正。如何检查a<=b?Sub 0<=b-a检查b-a是否为正。如何检查a<b?Sub a-b<0检查a-b是否为负。如何检查a>b?Sub 0>b-a检查b-a是否为负。

简单地说,对于给定的操作,计算机可以在引擎盖下面执行以下操作:

a>=b==msb(a-b)==0a<=b==msb(b-a)==0a>b==msb(b-a)==1a<b==msb(a-b)==1

当然,计算机实际上也不需要执行==0或==1。对于==0,它可以将电路中的msb反相。

无论如何,他们肯定不会将a>=b计算为a>b||a==b lol

即使有差异,你也不应该注意到。此外,在实践中,除非你要使用一些神奇的常数,否则你必须做一个额外的a+1或a-1来使条件成立,这无论如何都是一个非常糟糕的实践。

我认为两者都不快。编译器在每个条件下生成具有不同值的相同机器代码。

if(a < 901)
cmpl  $900, -4(%rbp)
jg .L2

if(a <=901)
cmpl  $901, -4(%rbp)
jg .L3

我的示例if来自Linux上x86_64平台上的GCC。

编译器编写者是非常聪明的人,他们认为这些事情以及我们大多数人认为理所当然的其他事情。

我注意到,如果它不是常数,那么在这两种情况下都会生成相同的机器代码。

int b;
if(a < b)
cmpl  -4(%rbp), %eax
jge   .L2

if(a <=b)
cmpl  -4(%rbp), %eax
jg .L3

至少,如果这是真的,编译器可以轻松地优化a<=b到!(a>b),因此,即使比较本身实际上较慢,但除了最简单的编译器之外,您也不会注意到差异。

您可以说这行在大多数脚本语言中都是正确的,因为额外的字符会导致代码处理稍慢。然而,正如上面的答案所指出的,它在C++中应该没有任何影响,而使用脚本语言所做的任何事情都可能不太关心优化。