问题描述
|
在当今的现代处理器上,分支条件的大于和大于或等于比较之间是否存在性能差异?如果我有一个容易发生的情况,选择ѭ0而不是ѭ1会有一点优势吗?反之亦然? (这适用于Intel或AMD硬件上的编译语言)
解决方法
比较不同谓词之间的区别不应该有任何明显的区别,因为它们的计算方式(请注意,我没有详细阅读x86手册,因此可能会有所不同):
大多数指令会产生几个标志作为副产品,通常至少有:进位(c),溢出(o),零(z)和负数(n)。
使用由x-y指令创建的谓词(可靠地创建上述4个谓词),我们可以轻松地轻松算出所有所需的比较。对于无符号数字:
b == b = b ==!(a b)
这当然不是它在CPU中的实现方式,这更多的琐事。
, 我严重怀疑是否存在差异。
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融合到一个宏op中-所谓的macro-op融合具有一些不错的优势。而且该规则从一种架构更改为另一种架构,并且需要更长的时间。例如,仅测试溢出,奇偶校验或符号标志(JO,JNO,JP,JNP,JS,JNS)的分支可以与TEST融合,而不能与c2d和nehalems上的CMP融合(您敢打赌,我看了一个,第7.5节) 。
因此,我们可以说它很复杂而不用担心这样的事情吗?除非您正在为编译器编写优化器,否则是因为–与您在源代码中编写的内容无关,编译器无论如何都会做它想要做的事情–并且有充分的理由(即,如果从理论上讲,JGE更快,您可以\“ d通常必须写if(x