我想知道哪种操作更快:
s
这一个
int c = version1.compareTo(version2);
或者
if (c == 1)
签名比较是否只使用一位检查和平等比较使用减法,或者它不是真的?确切地说,让我们说我们在x86上工作。
P.S。不是优化问题,只是想知道它是如何工作的。
答案 0 :(得分:2)
“它是如何工作的”实际上取决于平台(例如硬件指令集),您正在使用的Java版本以及上下文(例如,在程序之前和之后发生的事情。)
对于它的价值,有一个java
命令行选项将为特定方法转储JIT编译的本机代码:
但是,您应该知道这两个测试不相同。具体来说,Comparable<T>.compareTo(T)
方法不能保证返回-1,0或+1。规范说它可以返回任何整数。因此,对c == 1
的测试可能无效......取决于compareTo
的实施方式。
答案 1 :(得分:2)
假设这些操作在没有任何优化的情况下被嵌入到x86操作码中,则没有区别。两种情况的可能的x86伪程序集片段可能是:
cmp i, 1
je destination
和
cmp i, 0
jg destination
cmp
操作在两个操作数(寄存器i
和立即0
)之间执行减法,丢弃结果并设置一些标志:正,负,溢出等。
这些标志然后用于触发条件跳转(即条件跳转),在一种情况下,如果两个操作数是 e qual,在第二种情况下,如果第一个是 g 比第二个更快。
同样,这不考虑任何软件(JVM方面)和/或硬件优化。实际上,x86_64体系结构具有复杂的流水线,具有高级分支预测和无序执行,这些微基准测试几乎毫无意义。我们很早都在计算指示。