不等式运算符比等式运算符更快吗?

时间:2009-06-22 23:58:41

标签: optimization performance cpu-speed

我知道这是一个微观优化,所以我出于纯粹的好奇心。

逻辑上,微处理器不需要比较相等运算符的两个操作数的所有位,以确定“FALSE”结果。

注意,这与编程有关,因为它会影响程序的执行速度。

10 个答案:

答案 0 :(得分:47)

通常,微处理器使用电门进行比较而不是像这样逐步进行比较。它一次检查所有位。

答案 1 :(得分:29)

这取决于您的平台,但一般来说,它的性能相同。

例如,在X86上,您可以通过查看程序集的工作原理来看到这一点。查看X86 assembly control flow operations - 无论你是平等还是不平等,它都是以2个操作完成的。

首先,进行CMP(比较)操作。然后检查比较是否相等,不等于等等。这只是检查比较的结果 - 在这两种情况下,你正在进行2次操作。

然而,在许多高级编程语言中,情况有所不同。许多语言在平等方面定义不平等 - 检查不平等,进行等式检查,然后再检查是否为假。这使得在这些语言中(显微镜)更快地达到平等。许多语言也允许你专门写两种语言 - 但很多人倾向于在平等方面写出不平等,这通常会使得平等的速度稍快一些。

答案 2 :(得分:12)

听起来你应该阅读Intel 64 and IA-32 Architectures Optimization Reference Manual

在那里查看您使用的说明中的“管道延迟”和“管道延迟”。可以说,使用整数执行的所有操作都需要大约1个时钟周期才能执行(每秒40亿次)。从内存中读取数据可能需要100-1000,具体取决于您使用的数据量。更重要的是。

答案 3 :(得分:10)

比较通常作为忽略结果的减法实现。 CPU中的加法器将同时对所有位进行操作,因此这是一个恒定的时间操作。

等式只是确定输出是否为0.在x86上,有一些标志作为比较结果设置,分支通过jz或jnz完成(如果为零则跳转,如果不为零则跳转)。所以不,没有真正的速度差异。

其他平台(例如ARM和IA64)的行为类似。

答案 4 :(得分:3)

指令本身将以与其他答案相同的速度执行。

您可能遇到的区别在于分支预测或缓存效果。这将因处理器和处理器以及编译器而异,因此无法进行概括。如果你处于可以产生影响的水平,唯一的方法就是尝试并测量。

答案 5 :(得分:2)

比较操作发生在微处理器时钟信号的上升沿(或可能下降沿)。然后,下一个操作在下一个时钟周期发生。因此,就执行速度而言,平等和不平等对于当今市场上的几乎每个处理器都需要相同的时间。

我说几乎因为我记得读过一些本应该不是基于时钟的处理器,而是基于操作时间的,所以如果比较操作确实比add op更快,那么一组 n 比较将花费的时间少于 n 添加的时间。但我大约99%肯定这只是一些研究项目,而不是商业产品:)

答案 6 :(得分:2)

有一些小案例可能会产生一些影响。

在ARM处理器上(对于32位/非拇指指令集架构(ISA)),所有指令都是有条件的。有时候,尽管有多种条件,你仍然可以使用一个具有单个分支的内循环(从最后开始)。在一些具有逻辑比较(TEQ)的情况下,干扰少数标志(影响负(N)和零(Z),但不承载(C)或溢出(V)),允许毛茸茸的代码避免分支指令(未完成)。

相反,IIRC(我从来没有对其进行过编程,但十多年前已经查看了C编译器的输出)68000只有寄存器D4的文字EOR / XOR指令。所以算术比较可能会更好(尽管你仍然可以忽略无关的标志 - 关键是指令集有点不规则)。

如前一张海报所述,大多数操作都会因内存,磁盘,网络和网络服务延迟而上升。

答案 7 :(得分:2)

如果你想提出一个更普遍的问题,你必须考虑合理分配TRUE和FALSE答案,你必须考虑任意字长,包括长于寄存器。

在搜索算法(并且排序可以被视为搜索的扩展)中,更常见的是使用诸如“<”之类的运算符。或“< =”而不是“==”。这是因为来自“==”运算符的结果的分布倾向于高度偏向“假”,因此它们每次执行具有低熵(即,低信息产量)。这意味着他们必须执行更多次才能获得相同的信息 - 见证线性搜索。

在任何一种情况下,它们都采用O(字长)数量的比特,但是,如果字长是< =寄存器长度,则比较并行发生,并且可能有小的延迟进行传播。 (实际上,正如我所想的那样,在典型的不平等情况下,要么比较可以在第一个不等的位上停止,如果相等的概率足够小,那么可能很早就会发生。)

答案 8 :(得分:1)

像这样进行比较所需的时间通常是一个时钟周期。

32位处理器将同时执行所有32位; 64位将一次执行64位。

如果管道中存在延迟或停顿,那将是因为操作数不可用并且必须被提取。 那是最大的开销。但这可以在适合处理器架构的块中完成,因此它仍然可以作为32位或64位单元拉入。

答案 9 :(得分:1)

每个人都假设的一个方面是他正在谈论注册级别指令。每个人都是对的,它基本上没有CPU级别的东西。甚至更高层次的高级别操作也会将不平等写成平等的呼吁否定。

然而,即使更高,使用提问者的优化也会同时发挥作用。这就是平等可以写成与不平等一样有效。

此外,对于与汇编操作有关的人而言,CMP和SUB之间的唯一区别是设置了哪些标志。它们通常与机器的相同部分一起执行,因为CMP必须返回表示相等的标志,小于和大于。