什么是更快:同等检查或签署检查

时间:2015-06-13 14:34:31

标签: java performance comparison equality cpu-architecture

我想知道哪种操作更快:

s

这一个

int c = version1.compareTo(version2);

或者

if (c == 1)

签名比较是否只使用一位检查和平等比较使用减法,或者它不是真的?确切地说,让我们说我们在x86上工作。

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

2 个答案:

答案 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体系结构具有复杂的流水线,具有高级分支预测和无序执行,这些微基准测试几乎毫无意义。我们很早都在计算指示。