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

可能重复:
是否“如果”比“switch()case”更快?
Java中if / else和switch的相对性能是什么?

我一直在编码在运行再次….当debugging程序通过一个case语句的步骤跳转到立即匹配条件的项目,但是当相同的逻辑是指定使用if / else它遍历每个if语句直到find胜利者。 case语句是否更有效率,还是我的debugging器只是优化步骤? (不要担心语法/错误,我在SO中input,不知道它是否会编译,它的原理我后,我不想做他们作为整数,因为我隐约记得一些事情case使用带ints的偏移量)我使用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{ } 

看起来,编译器在优化switch-statement而不是if语句方面更好。

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

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

debugging器使它变得更简单,因为你不想单步执行编译器创build的实际代码。

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

看到密切相关的问题是“其他如果”比“开关()情况下”更快? 。

除C#以外的其他语言当然会以不同的方式实现它,但交换机通常更高效。

许多编程语言对开关语句进行了优化,使其比标准的if-else if结构快得多,只要这些结构是编译器常量。 许多语言使用跳转表或索引分支表来优化开关语句。 维基百科对switch语句进行了很好的讨论。 另外, 这里是对C中开关优化的讨论。

有一点需要注意的是switch语句可能会被滥用,根据具体情况,最好使用多态而不是switch语句。 看这里的例子。

我相信,因为case必须是常量值,switch语句与goto等价,因此根据variables的值跳转到正确的case,而在if / then语句中,它必须评估每个expression式。

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

我认为这只是简单的debugging器。 请注意,一个案件和“如果列表”并不完全相同。 为什么case block 通常以“break”结束是有原因的。 在assembly中分解时,case 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 

如果你没有rest,那么大小写会丢失“GOTO END”的句子,事实上,如果你在“car”的情况下,你实际上运行了两个部分

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

维基百科的Switch语句条目非常大,而且非常好。 有趣的一点:

  • 交换机本身并不快。 这取决于语言,编译器和具体的使用。
  • 编译器可以使用跳转表或索引函数指针优化开关。
  • 这个声明受到Stephen Kleene (和其他人)一些有趣的math的启发。

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