优化:switch语句中的用例顺序重要吗?
Optimization: Is the order of cases in a switch statement important?
考虑您选择的语言(例如,Java, C, c#…)中的switch
语句。当然,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语句的方法:硬编码二进制搜索
索引跳转表
散列跳转表
都要求编译器重新排序子句。选择哪一个取决于语言、目标处理器、case子句中值的分布,可能还取决于月相。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 函数调用中参数的顺序重要吗
- 为什么不;名字在地图上是按顺序排列的吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 数到第n个楼梯的路(顺序无关紧要)
- 优先顺序:智能指针和类析构函数
- 在循环中按顺序遍历成员变量
- 独立读取-修改-写入顺序
- QML按钮点击功能执行顺序
- C++中数据类型修饰符的顺序
- 当比特(而不是字节)的顺序至关重要时的持久性
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 通过选项卡的文本设置QTabWidget顺序
- c++11评估顺序(未定义的行为)
- 如何在C++中递归地按相反顺序打印集合
- 给定顺序中的事件处理
- 具有包含其他对象的类的对象创建顺序
- 通过switch和static_cast访问多态对象的运行时类型
- 优化:switch语句中的用例顺序重要吗?