performance - 使用 XOR 而不是减法的 x86 比较指令

标签 performance assembly x86 comparison

我听说 x86 比较指令:cmp x, y做减法并根据结果设置各种标志。

现在,如果我只想测试两个操作数是否相等怎么办?做 XOR 而不是减法会快得多吗?我的问题是,是否有一条指令与 XOR 进行比较以判断两个操作数是否相等?也许它看起来像这样:cmpeq x, ycmpxor x, y .

我猜,如果我只想测试相等性,请使用 cmpxor会比 cmp 快, 进行减法运算。有没有像cmpxor这样的指令那会给我一个加速吗?

我还想说,我知道 xor将设置 zero flag .但如果我这样做 xor x, y ,它会改变 x .我不想要那个。我想要一个将两个操作数单独保留的比较指令。

最佳答案

XOR、SUB、CMP、TEST 等基 native 器操作都非常简单,因此它们的操作速度都非常快。他们还设置了相同的条件代码位。从比较相等的角度来看,这些都以相同的方式设置 Z 位;其他位设置不同,因为这些操作计算不同的结果。

对于 x86 CPU,它们的执行时间没有区别,因为它们都使用相同的路径通过芯片。因此,您可以使用它们中的任何一个而不会影响性能,因为它可以计算您想要的答案。 (从技术上讲,SUB 应该比 XOR 花费更长的时间,因为进位必须通过所有位“波动”,而 XOR 是逐位并行的。CPU 设计人员已经找到了构建极快进位计算逻辑的方法,因此有效时差并不显着。他们有很大的动机这样做,因为计算机所做的大部分事情都是“添加”])。

作为一种风格约定,如果您认为您正在“比较两个(机器字大小的)值”,您可能应该使用 CMP 指令,因为它会将您的想法传达给代码的读者。它的优点是它不会破坏其中一个操作数,一旦您编写了足够的代码,您最终会发现使用它而不是 XOR 是一个非常有说服力的论据。 (TEST 有这个很好的属性,也可用于检查位)。

还有其他 x86 指令更好的其他类型值的比较:浮点比较、字符串比较、向量寄存器比较等。 这些指令比基本操作花费的时间不同,因为它们必须做更复杂的事情(比如比较多个数据字)。

关于performance - 使用 XOR 而不是减法的 x86 比较指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16419960/

相关文章:

c++ - 如何在处理传统 C 字符串的 C 风格函数中有效地使用 std::string?

Javascript for 循环性能

c++ - 是否可以在 C++17 的 GCC 中使用显式寄存器变量?

c - x86汇编代码解释

assembly - 如何为我的引导加载程序制作内核?

Python 性能 : Try-except or not in?

performance - Netty应用优化

c - NEON 寄存器中的添加

assembly - 什么时候需要在汇编中指定操作数的大小?

c++ - 了解 FMA 性能