优化:switch语句中的case的顺序是否重要?

时间:2014-06-01 20:05:39

标签: java c# c++ c switch-statement

考虑使用您选择的语言的switch语句(例如,Java,C,C#...)。当然,case语句的顺序如果有落差则很重要,但假设每个case都有break,所以顺序没有语义重要性。

例如,在考虑优化时,case语句的顺序是否重要?是按升序对案件进行排序还是在订购中没有任何好处?编译器执行的优化可能取决于case的顺序。由于任何编译器可能会也可能不会选择这样的优化,我不想在这里要求特定的语言或编译器。问题是关于可能发生的事情。

3 个答案:

答案 0 :(得分:3)

答案不仅取决于语言,还取决于编译器,甚至取决于您选择的编译器设置。根据我选择的gcc优化设置,我发现它在C ++方面有所不同。

这是因为编译器可能选择将switch语句实现为一系列测试,就像一系列if / else if语句一样,或者它可以选择将switch语句实现为跳转表。对于早期测试,一系列测试会更快,而跳转表通常会同样快速,无论顺序如何。

如果您的编译器将switch语句实现为一系列测试 - 并且不对它们进行重新排序 - 将更可能的情况放在更早的情况下将导致更快的代码。据我所知,更早出现更可能的情况通常不会导致代码变慢,因此如果您的代码花费大量时间执行此switch语句,那么更早发布更常见的情况就不会有什么坏处。 / p>

但是,如果您还没有对代码进行分析,并且您不知道switch语句是性能问题,那么最好使用&的顺序编写switch语句。 #39; s对于阅读代码的人来说是最清晰的。

答案 1 :(得分:1)

根据这个基准判断它确实很重要: http://pastebin.com/rJMEunAT

第一种方法以0.2423蜱完成,第二种方法以0.1654蜱完成

答案 2 :(得分:1)

对于禁止多个case子句匹配的语言,以及编译器至少有一些优化的语言,几乎可以肯定,你编写case子句的顺序几乎不会有所区别。

有三种流行的编译switch语句的方法:

  • 硬编码二进制搜索

  • 索引跳转表

  • 哈希跳转表

这三个都要求编译器重新排序子句。将选择哪一个取决于语言,目标处理器,案例子句中值的分布,以及可能的月相。