哪个更快:相等检查或符号检查

What is faster: equal check or sign check

我想知道哪个操作更快:

int c = version1.compareTo(version2);

这个

if (c == 1)

或这个

if (c > 0)

符号比较只使用一位检查而相等比较使用减法,还是不正确?可以肯定的是,假设我们在 x86 上工作。

P.S。不是优化问题,只是想知道它是如何工作的。

"How it works" 实际上取决于平台(例如硬件指令集)、您使用的 Java 的版本以及上下文(例如程序前后发生的事情。 )

值得一提的是,有一个 java 命令行选项可以转储特定方法的 JIT 编译本机代码:

  • Disassemble Java JIT compiled native bytecode

但是,您应该知道这两个测试并不等同。具体来说,Comparable<T>.compareTo(T) 方法不能保证 return -1、0 或 +1。规范说它可以 return 任何整数。因此,对 c == 1 的测试可能无法正常工作……取决于 compareTo 的实施方式。

假设这些操作在没有任何优化的情况下被 JITted 到 x86 操作码中,则没有区别。对于这两种情况,一个可能的 x86 伪汇编代码片段可能是:

cmp i, 1
je destination

和:

cmp i, 0
jg destination

cmp运算在两个操作数(寄存器i和立即数0)之间执行减法,丢弃结果并设置一些标志:正数、负数、溢出等。

这些标志然后用于触发条件跳转(即如果条件跳转),在一种情况下,如果两个操作数是 equal,在第二种情况下,如果第一个g比第二个大

同样,这没有考虑任何软件(JVM 方面)and/or 硬件优化。事实上,x86_64 架构有一个复杂的管道,具有高级分支预测和乱序执行,这些微基准测试几乎没有意义。我们早就过了计数说明。