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

标签 java performance if-statement switch-statement

<分区>

Possible Duplicate:
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 的执行速度比 if 版本稍快(在我的机器上每次调用 1.4 纳秒)。

我一直认为,只有在至少可以避免一些ifs 之前,转换的好处才会发挥作用,

为什么 switch 比单个 if 更快?

最佳答案

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

切换

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 指令应该更慢,除非有足够多的情况使其构造有值(value),但这只是常识。每个 JVM 都可能以不同的方式实现它,所以这只是猜测。

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

关于java - 为什么单个 "if"比 "switch"慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14094005/

相关文章:

java - 使用反射检索对象的类名

mysql - Grails createCriteria mysql IF 语句

如果列的组合(允许重复)是唯一的,则 MySQL 仅插入新行

performance - Scala Collection 排序、sortWith 和 sortBy 性能

c - 小数点后面的值 浮点值

java - 如何使用 Mac OS X 在 Sublime text 2 上编译 JAVA?

java - Jenkins SSH 步骤无效私钥

java - Android中整个布局的滚动条

python - 将line_profiler与numba jitted函数配合使用

c# - 比较ints和ints还是比较strings和strings效率更高