【问题标题】:Switch statement vs if statement, which is better for performance? [duplicate]switch 语句与 if 语句,哪个性能更好? [复制]
【发布时间】:2011-11-30 15:24:17
【问题描述】:

可能重复:
If vs. Switch Speed

我将以 c++ 为例,但我要问的问题不是针对特定语言的。我的意思是一般。哪一个对性能更好?这不是关于编程风格的问题。

当然,在某些情况下,switch 语句可能比 if 语句更易于使用。但是,如果您想要最大的性能。比如如果有数千行代码和 10 多个 switch 语句可以用 if 语句代替,哪一个会带来更好的性能?

例子:

if(x == 6){
do this
}

if(x == 67){
do this * 2
}

if(x == 9000){
do this * 3
}

对比

//Please forgive me if the syntax for the switch statement is wrong, I haven't use one in any programming language for a long time
Switch(x){
case 6:
    do this

case 67:
    do this * 2

case 9000:
    do this * 3
}

那么这在性能上有何不同?当您回答时,请确保您的回答包含您所指的编程语言。如果在 java 中,请说明您在谈论 java 而不是 c++、javascript,以及您选择回答我的问题的任何语言。

【问题讨论】:

  • 你为什么不自己做一个基准测试?
  • 我很确定,无论是哪种语言,即使调用了十亿次,两者之间也不会有任何明显的区别。使用更具可读性和可维护性的内容。
  • 请务必在switch 中包含break;s,否则代码将不等价。
  • 这是在伪代码中还是您打算让代码评估所有if 语句并执行switch 中的所有cases
  • @Toomai 这不是重点......这只是开关与 if 的想法。

标签: java c++ performance coding-style


【解决方案1】:

Switch 可能(取决于实现)使用跳转表(在 c 和 c++ 中),因此在某些条件下它可能会更高效。一般来说,它更清楚地表明了你的意图,因此编译器可以假装它很聪明。

考虑到您的示例中的if 甚至不使用else if 链,它使switch 更快(因为没有评估所有 条件)并且还可能改变您的含义代码(以防您的 dothises 修改 x)。

【讨论】:

  • 跳台?你愿意解释一下那是什么吗?
  • if 语句也可以,这取决于编译器的智能程度。
  • 跳转表有一个要跳转到的代码行表。就像goto line[x];
  • @VladLazarenko,也许,但帮助编译器一点问题都没有;-)
【解决方案2】:

好吧,正如此处所述:If vs. Switch Speed 和此处:Advantage of switch over if-else statement

所以实际上 switch 在某些情况下比许多链式 if-else 语句更快,因为编译器能够进行一些优化。

【讨论】:

    【解决方案3】:

    在 C++ 中,switch 语句的执行速度比多个 if 语句要快。这是因为编译器能够优化 switch 语句,但是如果有多个 if,代码必须按照程序员设置的顺序处理每个 if 语句。使用 switch 语句,它不依赖于早期的情况,因此编译器能够以一种更快执行的方式重新排序。

    【讨论】:

      【解决方案4】:

      通常,如果您有一个非常具体的值/操作列表,则两者都可以。由于能够从已知的编译时间值创建跳转表,因此在大多数情况下 Switch 可能会更快一些。但是,在某些特定情况下,您可以使用 switch 语句专门提高性能,例如Duff's Device

      【讨论】:

      • 现代编译器可以生成比使用 Duff 设备创建的代码更好的代码,并且更具可读性。不要忘记展开循环会增加代码大小,这也会降低 CPU 的速度(为指令读取更多内存)。
      【解决方案5】:

      根据这个基准,switch 语句更快。

      http://jsperf.com/switch-vs-if3

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-29
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多