在现代处理器上,对于分支条件的大于和大于等于比较是否存在性能差异?如果我有一个条件可以轻松地选择其中任意一个,是否选择>
或>=
会稍微有点优势?(这将用于英特尔或AMD硬件上的编译语言)
在现代处理器上,对于分支条件的大于和大于等于比较是否存在性能差异?如果我有一个条件可以轻松地选择其中任意一个,是否选择>
或>=
会稍微有点优势?(这将用于英特尔或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更受限制但更快(通常情况下)。
此外,现代架构(从英特尔C2D开始)有时可以将两个µops融合成一个宏操作——所谓的宏操作融合,具有一些不错的优点。而且这方面的规则从一个架构到另一个架构都会改变,并且比较复杂。例如,仅测试溢出、奇偶校验或符号标志的分支(JO、JNO、JP、JNP、JS、JNS)可以与C2D和Nehalems上的TEST融合,但不能与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中的实现方式,这只是一些趣闻。
我真的怀疑这有什么区别。