大于和大于或等于之间是否有任何性能差异?

时间:2011-05-30 16:41:09

标签: optimization machine-instruction

在今天的现代处理器上,分支条件的大于或大于或等于比较之间是否有任何性能差异?如果我的条件很容易,那么选择>而不是>=还是反之亦然? (这适用于Intel或AMD硬件上的编译语言)

3 个答案:

答案 0 :(得分:6)

在比较不同的谓词之间不应该有任何明显的区别,因为它们的计算方式(注意我没有详细阅读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更有限但更快(通常)。

现代架构(从intel侧的c2d开始)有时可以将两个μop融合到一个宏操作中 - 所谓的宏操作融合具有一些很好的优点。而且规则从一个架构变为另一个架构并且有点长。例如,仅测试溢出,奇偶校验或符号标志的分支(JO,JNO,JP,JNP,JS,JNS)可以与TEST融合,但不能与c2d和nehalems(you bet I looked that one up - section 7.5)上的CMP融合。

那么我们可以说它很复杂而且不担心这些事情吗?那是因为如果你正在为编译器编写一个优化器,因为它真的 - 独立于你在源代码中编写的内容,编译器无论如何都会按照它想要的那样做 - 并且有充分的理由(例如,如果JGE在理论上更快,你就有了if(x

答案 1 :(得分:4)

我不太确定如何在ALU / FPU中完成底层实现,但是对于所有这些实现只应该有一个操作(在原始类型上)

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

您可以使用一个事件来实现所有关系运算符:

a < b is the base
a > b == b < a
a >= b == !(a < b)
a <= b == !(a > b)

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

答案 2 :(得分:-1)

我严重怀疑是否存在差异。