“其他如果”比“switch()case”更快?

可能重复:
在C#中使用if / else和switch-case之间有什么显着区别吗?

我是一名前Pascal家伙,目前正在学习C#。 我的问题如下:

下面的代码比开关更快吗?

int a = 5; if (a == 1) { .... } else if(a == 2) { .... } else if(a == 3) { .... } else if(a == 4) { .... } else .... 

而开关:

 int a = 5; switch(a) { case 1: ... break; case 2: ... break; case 3: ... break; case 4: ... break; default: ... break; } 

哪一个更快?

我问,因为我的程序有一个类似的结构(许多“其他如果”的声明)。 我应该把它们变成开关吗?

只有几个项目,差异很小。 如果你有很多项目,你一定要使用一个开关。

如果交换机包含五个以上的项目,则使用查找表或哈希列表来实现。 这意味着所有的项目获得相同的访问时间,与if:s列表相比,最后一个项目需要更多的时间才能达到,因为它必须首先评估每个先前的条件。

你为什么在乎?

99.99%的时间,你不应该在乎。

这些微优化不太可能影响你的代码的性能。

另外,如果你需要关心,那么你应该在你的代码上进行性能分析。 在这种情况下,找出switch case与if-else块之间的性能差异将是微不足道的。

编辑:为了清楚起见:实施任何设计更清晰,更易于维护。 一般来说,当遇到一个巨大的switch-case或if-else块时,解决方案就是使用多态。 找到正在改变的行为并封装它。 我不得不面对这样巨大的,难看的开关案例代码,通常这并不难以简化。 但是,如此令人满意。

相信这个性能评估 ,开关盒更快。

这是结论:

结果显示switch语句比if-else-if梯形图执行速度快。 这是由于编译器能够优化switch语句。 对于if-else-if梯形图,代码必须按照程序员确定的顺序处理每个if语句。 但是,由于switch语句中的每个case不依赖于以前的情况,因此编译器能够以提供最快执行的方式重新排序测试。

还有一件事要考虑:这真的是你的应用程序的瓶颈吗? 有非常罕见的情况下,真正需要这种优化。 大多数情况下,您可以通过重新思考算法和数据结构来获得更好的加速。

我想说开关就是要走的路,这是既快又好的做法。

有各种链接,如( http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx )显示比较两者的基准测试。

不应该很难测试,创建一个功能,切换或5个数字之间的ifelse,扔一个兰特(1,5)到该功能,循环几次,同时计时。

开关通常比一长串的ifs更快,因为编译器可以生成一个跳转表。 列表越长,switch语句越好于if语句。

可读性问题远比开关的性能好处更重要(相对轻微但值得注意)。

对于一个人来说,我发现一个switch语句在意图和纯粹的空白中非常清晰,与ifs的链相比。

从技术上讲,他们产生完全相同的结果,所以他们应该以几乎相同的方式进行优化。 但是,编译器会比跳转表优化switch case的机会更多。

我在这里谈论一般情况。 对于5个条目,假设您按频率排序条件,那么对if进行的平均测试次数应该小于2.5。 除非是在一个非常紧密的环路中,否则几乎不会写回家的瓶颈。

如果可能, switch通常会被编译器翻译成查找表。 因此,查找一个任意的情况是O(1),而不是实际做几个案例比较之前找到你想要的。

所以在很多情况下if / else if链会变慢。 尽管如此,取决于您的案件被打的频率可能没有什么区别。

我不确定,但我相信一个或另一个的速度取决于您使用的编程语言。

我通常更喜欢使用开关。 这样的代码是简单的阅读。

简短的回答:开关语句更快

if语句平均需要两次比较(运行示例代码时)以得到正确的子句。

switch语句的平均比较次数将是1,而不管你有多少不同的情况。 编译器/虚拟机将在编译时创建可能选项的“查找表”。

如果您经常运行此代码,虚拟机是否可以以类似的方式优化if语句?

由于switch语句与if / else链表达了相同的意图,但是以更加严格的正式方式表达,所以您的第一个猜测应该是编译器能够更好地优化它,因为它可以得出关于条件的更多结论你的代码(即只有一个状态可能是真实的,被比较的值是一个原始类型等等)。当你比较两种类似的语言结构来实现运行时,这是一个相当安全的一般事实。

请参阅http://msdn.microsoft.com/zh-CN/library/system.reflection.emit.opcodes.switch%28VS.71%29.aspx

switch语句基本上是一个查找表,它具有已知的选项,如果语句像布尔类型。 根据我的开关和if-else是相同的,但对于逻辑开关可以帮助更好。 而if-else有助于在阅读中理解。