大于和大于等于之间有性能差异吗?

13

在现代处理器上,对于分支条件的大于和大于等于比较是否存在性能差异?如果我有一个条件可以轻松地选择其中任意一个,是否选择>>=会稍微有点优势?(这将用于英特尔或AMD硬件上的编译语言)


1
我对此表示怀疑,即使有的话,那也只是一根猫须毛那么多。 - Mike Dunlavey
这篇文章很有见地 https://tosbourn.com/less-than-vs-less-than-or-equal-to/ - Ryan Walker
这个回答解决了你的问题吗?是<比<=更快吗? - undefined
3个回答

12

比较不同的谓词之间不应该有任何明显的区别,因为它们的计算方式是相同的(注意,我没有详细阅读 x86 手册,所以可能会有所不同):

大多数指令都会生成几个标志位,通常至少有:进位(c)、溢出(o)、零(z)和负数(n)。

使用由 x-y 指令创建的这些谓词(可靠地创建上述 4 种谓词),我们可以轻松地找出所有想要的比较。对于无符号数:

x = y    z
x != y   !z
x < y    !c
x <= y   !c + z
x > y    c . !z
x >= y   c

所以它并没有太大的区别。但是有一些差异,大多数情况下取决于我们是否可以使用TEST(它是AND而不是完整的减法)或者必须使用CMP(即减法)。TEST更受限制但更快(通常情况下)。

此外,现代架构(从英特尔C2D开始)有时可以将两个µops融合成一个宏操作——所谓的宏操作融合,具有一些不错的优点。而且这方面的规则从一个架构到另一个架构都会改变,并且比较复杂。例如,仅测试溢出、奇偶校验或符号标志的分支(JO、JNO、JP、JNP、JS、JNS)可以与C2D和Nehalems上的TEST融合,但不能与CMP融合(我肯定会查阅 - 第7.5节)。

那么我们能不能说这很复杂,不用担心这些事情呢?除非你正在为编译器编写优化器,因为实际上——无论你在源代码中写了什么,编译器都会按照自己的意愿来执行——这是有充分理由的(如果JGE在理论上更快,你通常必须编写if (x < y))。如果你真的需要一个建议:与0进行比较通常更快。


5

我不确定ALU/FPU的底层实现方式,但是它们应该只有一个操作(对于原始类型而言)。

我真心希望这只是出于好奇而提出的问题,而不是为了优化。这样做不会大幅提高性能,而且你的代码很可能存在更糟糕的性能问题。

你甚至可以使用一个运算符来实现所有关系运算:

a < b 是基础
a > b == b < a
a >= b == !(a < b)
a <= b == !(a > b)

当然,这并不是CPU中的实现方式,这只是一些趣闻。


0

我真的怀疑这有什么区别。


我会买这个。直接明了。我真的相信它们没有任何区别。 - Manny Alvarado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接