整数的有序与相等比较

Ordered vs equality comparison of integers

在很多情况下,可以通过有序比较或相等比较来比较整数;如果你知道 i 永远不会大于 j,那么 i < j 和 i != j 是等价的。通常 运行 速度相同。

对于必须在所有 64 位上传播进位标志的有序比较,理论上可能比相等比较慢一个周期,但据我所知,通常情况并非如此。

是否有 任何 现有或开发中的 CPU,其中两个比较运算符(在机器字数字上,而不是 bignums)之间甚至存在单个周期的速度差异?

是的。但是,这很复杂并且非常依赖于特定目标处理器(可能有一些棘手的行为)。

在所有现代 desktop/server x86-64 处理器(例如 Intel 和 AMD 处理器)上,由 ><、 '==' 和 != 运算符。 cmptest 指令用于此(并且同样快)。在过去,test 指令要快一点 ,因此 ==!= 运算符是不正确的。但是,对于 Intel 处理器上 64 位寄存器上的 SSE/AVX SIMD 指令 来说,情况并非如此:相等运算符比有序比较运算符更快(更高的互惠吞吐量和更低的延迟).对于 AMD 处理器上 64 位寄存器上的 SSE/AVX SIMD 指令,这有点复杂:Zen/Zen2 的行为方式与英特尔处理器相同,但两种操作的延迟相同,并且在 Zen3 上使用有序比较运算符实际上至少与相等运算符一样快(experiments 表明它甚至更快 由于更高的专用端口)。 32 位寄存器上的 SSE/AVX 或 AVX-512 的情况不同(两个比较运算符的行为相同)。

据我所知,在大多数 ARM 处理器上,TST 指令与 CMP 指令一样快,而在 POWER 处理器上,只有一条指令用于这两种运营商等运营商应该同样快。我希望相等运算符通常与有序比较运算符一样快,并且在某些情况下更快。但是,我很确定,如果不是这种情况,会有一些奇怪的处理器(可能是非标准 ARM 处理器)。不过,这在主流处理器上非常罕见