大于和大于或等于之间是否存在性能差异?

问题描述

| 在当今的现代处理器上,分支条件的大于和大于或等于比较之间是否存在性能差异?如果我有一个容易发生的情况,选择ѭ0而不是ѭ1会有一点优势吗?反之亦然? (这适用于Intel或AMD硬件上的编译语言)     

解决方法

        比较不同谓词之间的区别不应该有任何明显的区别,因为它们的计算方式(请注意,我没有详细阅读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融合到一个宏op中-所谓的macro-op融合具有一些不错的优势。而且该规则从一种架构更改为另一种架构,并且需要更长的时间。例如,仅测试溢出,奇偶校验或符号标志(JO,JNO,JP,JNP,JS,JNS)的分支可以与TEST融合,而不能与c2d和nehalems上的CMP融合(您敢打赌,我看了一个,第7.5节) 。 因此,我们可以说它很复杂而不用担心这样的事情吗?除非您正在为编译器编写优化器,否则是因为–与您在源代码中编写的内容无关,编译器无论如何都会做它想要做的事情–并且有充分的理由(即,如果从理论上讲,JGE更快,您可以\“ d通常必须写if(x b == b = b ==!(a b) 这当然不是它在CPU中的实现方式,这更多的琐事。     ,        我严重怀疑是否存在差异。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...