案例与其他案例如果:哪个更有效率?

时间:2010-01-28 23:21:06

标签: performance switch-statement if-statement

  

可能重复:
  is “else if” faster than “switch() case” ?
  What is the relative performance of if/else vs. switch in Java?

我已经在运行中进行编码....当调试器逐步执行case语句时,它会立即跳转到与条件匹配的项,但是当使用if / else指定相同的逻辑时,它会逐步执行每个if语句直到找到胜利者。 case语句是否更有效,或者我的调试器只是优化了一步? (不要担心语法/错误,我在SO中输入这个,不知道它是否会编译,它的原理我之后,我不想做它们作为整理因为我依稀记得一些关于使用带有整数的偏移的情况)我使用C#,但我对编程语言的一般答案感兴趣。

switch(myObject.GetType()){

    case typeof(Car):
        //do something
        break;

    case typeof(Bike):
        //do something
        break;

    case typeof(Unicycle):
        //do something
        break;

    case default:
        break;
}

VS

   Type myType = myObject.GetType();

   if (myType == typeof(Car)){
            //do something
   }

   else if (myType == typeof(Bike)){
            //do something
   }

   else if (myType == typeof(Unicycle)){
            //do something
   }
   else{

   }

7 个答案:

答案 0 :(得分:83)

似乎编译器在优化switch语句方面优于if语句。

编译器不知道评估if语句的顺序对您是否重要,并且不能在那里执行任何优化。您可以在if语句中调用方法,从而影响变量。使用switch语句,它知道所有子句可以同时进行评估,并且可以按照最有效的顺序放置它们。

这是一个小比较:
http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx

答案 1 :(得分:9)

调试器使其更简单,因为您不想单步执行编译器创建的实际代码。

如果交换机包含五个以上的项目,则使用查找表或哈希表实现,否则使用if..else实现。

查看密切相关的问题is “else if” faster than “switch() case” ?

除C#之外的其他语言当然会或多或少地以不同的方式实现它,但切换通常更有效。

答案 2 :(得分:6)

许多编程语言优化了switch语句,因此它比标准if-else快得多,如果结构提供的情况是编译器常量。许多语言使用跳转表或索引branch table来优化switch语句。 Wikipedia对switch语句进行了很好的讨论。此外,here是对C中交换机优化的讨论。

需要注意的一点是,switch语句可能会被滥用,并且根据具体情况,最好使用多态而不是switch语句。有关示例,请参阅here

答案 3 :(得分:0)

我认为只是调试器使它变得简单。 请注意,案例和“if list”最终并不相同。案例块通常以“break”结束是有原因的。案例stmt在汇编时分解时实际上看起来像这样。

if myObject.GetType() == type of Car
    GOTO START_CAR
else if myObject.GetType() == type of Bike
    GOTO START_BIKE

LABEL START_CAR
//do something car     
GOTO END

LABEL START_BIKE
//do something bike  
GOTO END

LABEL END

如果你没有休息时间,那么案件区块将缺少“GOTO END”stmts,事实上如果你登陆“car”案例,你实际上会运行两个部分

//do something car     
//do something bike  
GOTO END

答案 4 :(得分:0)

我相信因为case必须是常量值,所以switch语句执行goto的等价,所以基于变量的值跳转到正确的情况,而在if / then语句中它必须评估每个表达式。

答案 5 :(得分:0)

它可以为case语句执行此操作,因为值是编译器常量。这里有一个更详细的解释http://sequence-points.blogspot.com/2007/10/why-is-switch-statement-faster-than-if.html

答案 6 :(得分:0)

维基百科的Switch statement entry非常大,实际上相当不错。有趣的观点:

  • 开关本身并不快。这取决于语言,编译器和具体用途。
  • 编译器可以使用跳转表或索引函数指针来优化开关。
  • 该声明的灵感来自Stephen Kleene(和其他人)的一些有趣的数学。

使用C开关进行奇怪而有趣的优化,请参阅Duff's Device