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

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


当前回答

它们的速度相同。也许在某些特殊的架构中,他/她所说的是对的,但在x86家族中,至少我知道他们是一样的。因为为此,CPU将执行一个减法(a-b),然后检查标志寄存器的标志。该寄存器的两位被称为ZF(零标志)和SF(符号标志),它在一个周期内完成,因为它将通过一个掩码操作完成。

其他回答

也许那本无名书的作者读到a>0比a>=1跑得更快,并认为这是普遍正确的。

但这是因为涉及0(因为CMP可以根据体系结构,例如用OR替换),而不是因为<。

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

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

假设我们讨论的是内部整数类型,不可能一个比另一个更快。它们显然在语义上是相同的。它们都要求编译器做完全相同的事情。只有一个严重损坏的编译器才能为其中一个生成劣质代码。

如果在某些平台上,对于简单整数类型,<比<=快,编译器应始终将常量的<=转换为<。任何没有这样做的编译器都将是一个糟糕的编译器(对于该平台)。

这将高度依赖于C编译到的底层架构。某些处理器和架构可能具有等于或小于等于的显式指令,这些指令以不同的周期执行。

但这很不寻常,因为编译器可以绕过它,使它变得无关紧要。

在C和C++中,编译器的一个重要规则是“仿佛”规则:如果执行X的行为与执行Y的行为完全相同,那么编译器可以自由选择使用哪一个。

在您的情况下,“a<901”和“a<=900”总是具有相同的结果,因此编译器可以自由编译任一版本。无论出于什么原因,如果一个版本更快,那么任何高质量的编译器都会为更快的版本生成代码。因此,除非您的编译器生成异常糟糕的代码,否则两个版本的运行速度将相等。

现在,如果你有一种情况,两位代码总是会产生相同的结果,但编译器很难证明,和/或编译器很难证实哪个版本更快,那么你可能会得到不同的代码以不同的速度运行。

PS如果处理器支持单字节常量(更快)和多字节常量(更慢),则原始示例可能以不同的速度运行,因此与255(1字节)进行比较可能比与256(2字节)进行对比更快。我希望编译器做任何更快的事情。