首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化:开关语句中的情况顺序重要吗?

问优化:开关语句中的情况顺序重要吗?
EN

Stack Overflow用户
提问于 2014-06-01 20:05:38
回答 3查看 1.7K关注 0票数 0

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-01 20:17:10

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

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

如果编译器将开关语句作为一系列测试来实现--并且没有重新排序--更可能的情况是,更早的情况会导致更快的代码。据我所知,将更可能的情况放在更早的位置通常不会导致更慢的代码,所以如果您的代码花费了大量时间执行这个switch语句,那么将更常见的情况放在更早的位置也不会有什么影响。

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

票数 3
EN

Stack Overflow用户

发布于 2014-06-01 20:34:07

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

第一种方法以0.2423秒结束,第二次以0.1654秒结束。

票数 1
EN

Stack Overflow用户

发布于 2014-06-01 20:36:56

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

编译开关语句的常用方法有三种:

  • 硬编码二进制搜索
  • 索引跳转表
  • 散列跳台

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23983964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档