【问题标题】:Why is a single "if" slower than "switch"? [duplicate]为什么单个“if”比“switch”慢? [复制]
【发布时间】:2012-12-30 19:43:32
【问题描述】:

可能重复:
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 快?

【问题讨论】:

  • 你知道它们编译后的样子吗?也许你可以在那里找到答案。
  • @user1306322- 您必须更深入地研究 JVM 是如何解释或编译该字节码的。第一个代码可能会使用lookupswitchtableswitch 指令,而第二个代码将使用正常跳转。让它们快速工作完全取决于 JVM。
  • 您能发布您的基准测试代码吗?
  • @PatriciaShanahan 测试代码比较 nanoTime()for (int i = 0; i < 999999; i++) x += useIf(i)x 被断言)

标签: java performance if-statement switch-statement


【解决方案1】:

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

开关

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

【讨论】:

  • 我必须承认,在多次运行测试后,有时 if 比 switch 更快。您关于没有任何特殊原因造成差异的评论反映了我通过进一步测试发现的结果
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2013-08-10
    • 2020-01-20
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多