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

考虑使用您选择的语言的switch语句(例如,Java,C,C#…)。 当然,如果存在突破,则case语句的顺序很重要,但假设每个case都有break ,因此顺序没有语义重要性。

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

答案不仅取决于语言,还取决于编译器,甚至取决于您选择的编译器设置。 我已经看到它在C ++方面有所不同,具体取决于我选择的gcc优化设置。

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

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

但是,如果您没有对代码进行概要分析并且您不知道switch语句是性能问题,那么最好使用对于正在阅读代码的人来说最清楚的顺序来编写switch语句。

从这个基准来看,它确实很重要: http : //pastebin.com/rJMEunAT

第一种方法在0.2423滴答处完成,第二种方法在0.1654处完成

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

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

  • 硬编码二进制搜索

  • 索引跳转表

  • 哈希跳台

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