哪个更快:相等检查或符号检查
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 架构有一个复杂的管道,具有高级分支预测和乱序执行,这些微基准测试几乎没有意义。我们早就过了计数说明。
我想知道哪个操作更快:
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 架构有一个复杂的管道,具有高级分支预测和乱序执行,这些微基准测试几乎没有意义。我们早就过了计数说明。