在当今的现代处理器上,分支条件的大于和大于或等于比较之间是否存在性能差异?如果我有一个很容易出现的情况,那么选择是否有任何轻微的优势,>
反之亦然>=
?(这适用于 Intel 或 AMD 硬件上的编译语言)
3 回答
比较不同的谓词之间不应该有任何明显的区别,因为它们的计算方式(注意我没有详细阅读 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
所以它几乎没有任何区别。但是有一些差异,主要归结为我们是否可以使用 TEST(这是一个 AND 而不是一个完整的减法)或必须使用 CMP(这是减法)。TEST 更受限制但更快(通常)。
现代架构(从英特尔方面的 c2d 开始)有时可以将两个微操作融合到一个宏操作中 - 所谓的宏操作融合具有一些不错的优势。并且从一种架构到另一种架构的更改规则会更长一些。例如,仅测试溢出、奇偶校验或符号标志(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 中的实现方式,这更琐碎。
我严重怀疑有什么不同。