12

可能重复:
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;
}

测试表明,执行速度比版本switch略快(在我的机器上每次调用 1.4 纳秒) 。if

我一直相信转换的好处只有在至少ifs可以避免一些情况下才会发挥作用,

为什么switch比单快if

4

2 回答 2

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

如果

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 时间来预热,通过将结果保持在置信范围内以及使分析足够正确以供使用的所有其他事情)

于 2012-12-30T19:52:09.860 回答
0

这种类型的比较在If-else 与 switch 中进行了分析——哪个更好?. 但是,尝试使用 gcj 编译为本机代码,并将获得的结果与使用字节码的结果进行比较。

于 2012-12-30T21:33:47.503 回答