2011-05-30 69 views
8

在今天的现代处理器上,分支条件下的大于或大于或等于比较之间是否存在任何性能差异?如果我的情况同样容易,那么选择>超过>=或反之亦然? (这将用于英特尔或AMD硬件上的编译语言)大于或大于或等于之间是否有任何性能差异?

+1

我对此表示怀疑,如果有的话,它会和猫的胡须差不多。 – 2011-05-30 17:09:04

回答

6

不应该有,因为他们计算的方式比较不同的谓词之间的显着差异(注意我没有详细阅读说明书x86的,因此它可能工作不同):

大多数指令通常你至少有:carry(c),overflow(o),zero(z)和negative(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(这是相减),那么这些差异大部分归结于事实。测试更有限但更快(通常)。

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

所以我们可以说它是复杂的,而不是担心这样的事情?这是除了如果你正在编写一个编译器的优化器,因为真的 - 独立于你在源代码中编写的东西,编译器会做它想要的 - 并且有很好的理由(例如,如果JGE理论上速度更快,写如果(x < y)通常..)。如果你真的需要一个建议:比较0通常更快。

3

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

我真希望这只是一个问题,因为你是好奇,而不是说你要优化,这将从未给你一个大的性能提升,最有可能你的代码将包含远远性能问题更糟糕。

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

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

这当然它不是如何在CPU中实现,这是更琐事。

-1

我严重怀疑是否有区别。

相关问题