优化:switch语句中的用例顺序重要吗?

本文关键字:顺序 switch 语句 优化 | 更新日期: 2023-09-27 18:06:21

考虑您选择的语言(例如,Java, C, c#…)中的switch语句。当然,case语句的顺序是重要的,如果有下降,但假设每个case都有一个break,所以顺序在语义上没有重要性。

例如,在考虑优化时,case语句的顺序重要吗?是按升序排序比较好,还是任何排序都没有好处?编译器可能会执行哪些优化,这些优化可能取决于case的顺序。因为任何编译器都可能选择也可能不选择这样的优化,所以我不想在这里要求使用特定的语言或编译器。问题是可能会发生什么

优化:switch语句中的用例顺序重要吗?

答案不仅取决于语言,还取决于编译器,甚至取决于您选择的编译器设置。我看到它在c++中是不同的,这取决于我选择的gcc优化设置。

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

如果编译器将switch语句实现为一系列测试,并且不重新排序,那么将更可能的情况放在前面将导致更快的代码。据我所知,把更可能的情况放在前面通常不会导致代码变慢,所以如果你的代码花了很多时间来执行这个switch语句,那么把更常见的情况放在前面是没有坏处的。

然而,如果你没有分析你的代码,你不知道switch语句是一个性能问题的事实,最好写switch语句使用的顺序是最清晰的人类阅读代码。

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

第一种方法完成于0.2423个滴答,第二种方法完成于0.1654

对于禁止多个case子句匹配的语言,并且编译器至少进行了一些优化,几乎可以肯定,您编写case子句的顺序不会有什么不同。

有三种常用的编译switch语句的方法:
  • 硬编码二进制搜索

  • 索引跳转表

  • 散列跳转表

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