不平等算子是否比平等算子更快?

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

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

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

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

这取决于你的平台,但总的来说,它的性能是一样的。

例如,在X86上,您可以通过查看程序集的工作方式来看到这一点。 查看X86程序集控制stream程操作 – 无论是平等还是不平等,它都是以2个操作完成的。

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

然而在许多高级编程语言中,事情是不同的。 许多语言在平等方面定义了不平等 – 检查不平等,做平等检查,然后再检查是否是错误的。 这导致这些语言的平等(显微镜)更快。 许多语言也允许你们专门写两者 – 但是许多人倾向于在平等的方面写作不平等,总的来说,平等又会稍微快一点。

听起来你应该阅读Intel 64和IA-32体系结构优化参考手册 。

在那里查看你使用的指令中的“pipe道延迟”和“stream水线延迟”。 只要说一下你所做的每件事都需要大约1个时钟周期才能执行(每秒40亿次)。 从内存中读取数据可能需要100-1000,具体取决于您处理的数据量。 更重要的是

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

然后,相等就是确定输出是否为0.在x86上,有比较的结果设置标志,分支通过jz或jnz完成(如果跳转为零,跳转为非零)。 所以不,不会有真正的速度差异。

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

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

我之所以这样说, 几乎是因为我回想起一些本应不是基于时钟的处理器,而是基于操作时间的,所以如果确实比较操作比加法操作更快,那么一组n比较会花费更less的时间n补充说。 但我约99%肯定这只是一些研究项目,而不是商业产品:)

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

哪里可能会遇到分支预测或caching效果差异。 这将因处理器,编译器和编译器而有所不同,所以不可能进行一般化处理。 如果你处于这个有所作为的水平,唯一的方法就是去尝试和衡量。

有一些小的情况下可能会有一些效果。

在ARM处理器上(对于32位/非Thumb指令集架构(ISA)),所有指令都是有条件的。 有时候,尽pipe有多个条件,你可以用一个内部循环来避开(从结尾到开始)。 在一些具有逻辑比较( TEQ )的情况下,干扰less数标志(影响负(N)和零(Z),但不能携带(C)或溢出(V))允许毛发代码避免分支指令)。

相反,IIRC(我从来没有真正编写它,但十多年前看过C编译器的输出)68000只有寄存器D4有一个字面的EOR / XOR指令。 所以算术比较可能会更好(虽然你仍然可以忽略无关的标志 – 重点是指令集有点不规则)。

正如之前发布的海报所提到的,大部分操作都是由内存,磁盘,networking和Web服务延迟引起的。

做这样的比较花费的时间通常是一个时钟周期。

一个32位处理器将一次完成所有的32位; 64位将一次执行64位。

如果在pipe道中存在延迟或停顿,那将是因为操作数不可用而必须被提取。 这是最大的开销。 但是,这将在一个适合处理器体系结构的块中完成,所以它仍然会作为一个32位或64位单元被引入。

如果你想提出这个更普遍的问题,你将不得不考虑一个合理的TRUE和FALSE答案的分布,你将不得不考虑任意字长,包括比寄存器长。

在searchalgorithm中(sorting可以被认为是search的扩展),比“==”使用“<”或“<=”等运算符更为常见。 这是因为“==”运算符的结果分布往往倾向于“错误”,因此它们每次执行的熵低(即信息产量低)。 这意味着他们必须执行更多次才能获得相同的信息 – 见证线性search。

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

每个人都假设的一个方面是他正在谈论注册级别的指令。 每个人都是对的,基本上是在CPU级别的事情上进行讨论。 甚至更高级的大多数高层次的操作写平等作为呼吁平等否定。

但是,更高级别,使用提问者的优化将双向工作。 这就是平等可以写得和不平等一样有效。

此外,对于与assembly操作有关的人员来说,CMP和SUB之间唯一的区别在于哪些标记被设置。 它们通常在机器的相同部分执行,因为CMP必须返回表示等于,小于和大于的标志。