大于和大于或等于之间是否存在任何性能差异



在当今的现代处理器上,分支条件的大于和大于或等于比较之间是否存在性能差异?如果我有一个同样容易的条件,那么选择>而不是>=有什么小优势吗?反之亦然?(这适用于英特尔或AMD硬件上的编译语言)

由于不同谓词的计算方式,比较它们之间应该没有任何明显的差异(请注意,我没有详细阅读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开始)有时可以将两个µop融合为一个宏操作,即所谓的宏操作融合,这有一些很好的优势。而且,从一个架构到下一个架构的规则会发生变化,而且会更长一些。例如,只测试溢出、奇偶校验或符号标志(JO、JNO、JP、JNP、JS、JNS)的分支可以与test融合,但不能与c2d和nehalems上的CMP融合(你敢打赌,我在第7.5节中看到了这一点)

那么,我们可以说这很复杂,而不担心这样的事情吗?除非你正在为编译器编写优化器,因为实际上,无论你在源代码中写什么,编译器都会做它想要做的事情,而且有充分的理由(即,如果JGE理论上更快,你通常必须写if(x<y)…)。如果你真的需要一个建议:与0进行比较通常会更快。

我不太确定ALU/FPU中的底层实现是如何完成的,但所有它们(在基元类型上)应该只有一个操作

我真的希望这只是一个问题,因为你很好奇,而不是你试图优化,这将永远不会给你带来很大的性能提升,而且很可能你的代码会包含更糟糕的性能问题。

您只需使用一个即可实现所有关系运算符:

a<b是基数a>b==b<一a>=b==!(a<b)a<=b==!(a>b)

这当然不是它在CPU中的实现方式,这是更多的琐事。

我非常怀疑两者之间有什么区别。

相关内容

  • 没有找到相关文章

最新更新