为什么单个“if”比“switch”慢?

时间:2012-12-30 19:43:33

标签: java performance if-statement switch-statement

  

可能重复:
  What is the relative performance difference of if/else versus switch statement in Java?

考虑以下两种方法:

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;
}

测试显示,switch执行速度稍慢(我的计算机上每次调用1.4纳秒),而不是if版本。

我一直认为,在至少可以避免少数ifs之前,开关的好处并没有开始,

为什么switch比单if更快?

2 个答案:

答案 0 :(得分:7)

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

<强> SWITCH

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

如果

public static useIf(I)I
 L0
  ILOAD 0
  IFNE L1
 L2
  INVOKESTATIC Tests.a()I
  IRETURN
 L1
  INVOKESTATIC Tests.b()I
  IRETURN

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

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

答案 1 :(得分:0)

此类比较在If-else vs switch – Which is better?中进行了分析。 但是,尝试使用gcj编译为本机代码,并将获得的结果与使用字节码的结果进行比较。