Wil*_*mKF 10 optimization machine-instruction
在今天的现代处理器中,分支条件的大于或大于或等于比较之间是否有任何性能差异?如果我有可能很容易被任何条件,没有任何轻微的优势,选择>了>=或反之亦然?(这适用于Intel或AMD硬件上的编译语言)
比较不同的谓词之间应该没有任何明显的区别,因为它们的计算方式(注意我没有详细阅读x86手册,所以它可能有所不同):
大多数指令产生几个标志作为副产品,通常你至少有:进位(c),溢出(o),零(z)和负(n).
使用由xy指令创建的那些谓词(可靠地创建上述4)我们可以轻松地找出所有想要的比较.对于无符号数字:
x = y z
x != y !z
x < y !c
x <= y !c + z
x > y c . !z
x >= y c
Run Code Online (Sandbox Code Playgroud)
所以它几乎没有任何区别.但是有一些差异,主要归结为如果我们可以使用TEST(这是一个AND而不是一个完整的减法)或必须使用CMP(这是减法)的事实.TEST更有限但更快(通常).
现代架构(从intel侧的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 a >= b == !(a < b) a <= b == !(a > b)
这当然不是它在CPU中的实现方式,这是更多琐事。