为什么单个"if"比"switch"慢?

Boh*_*ian 12 java performance if-statement switch-statement

可能重复:
Java中if/else与switch语句的相对性能差异是什么?

给出以下两种方法:

public static int useSwitch(int i) {
    switch (i) {
    case 0:
        return 1;
    default:
        return 0;
    }
}

public static int useIf(int i) {
    if (i == 0)
        return 1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

测试显示,switch执行速度比if版本快一点(我的机器每次调用1.4纳秒).

我一直认为开关的好处没有开始,直到至少有几个ifs可以避免,

为什么switch比单一的更快if

Jac*_*ack 7

通过检查字节码,结果如预期:

开关

public static useSwitch(I)I
 L0
  ILOAD 0
  TABLESWITCH
    0: L1
    default: L2
 L1
  INVOKESTATIC Tests.a()I
  IRETURN
 L2
  INVOKESTATIC Tests.b()I
  IRETURN
Run Code Online (Sandbox Code Playgroud)

如果

public static useIf(I)I
 L0
  ILOAD 0
  IFNE L1
 L2
  INVOKESTATIC Tests.a()I
  IRETURN
 L1
  INVOKESTATIC Tests.b()I
  IRETURN
Run Code Online (Sandbox Code Playgroud)

现在我没有看到任何一个应该比另一个慢的特定原因(在任何情况下都不是一个有意义的数量).这肯定是与特定JVM实现以及它如何执行这些操作码相关的东西.根据常识,TABLESWITCH指令应该更慢,除非有足够的案例使其构造有价值,但这只是普遍的想法.每个JVM都可以以不同的方式实现它,所以这只是推测.

您确定以一致的方式描述所有内容吗?(通过给JVM提供时间预热,将结果保持在置信范围内以及使得分析足够正确以便使用的所有其他事情)