考虑使用您选择的语言中的switch语句(例如,Java、C、C#.)。当然,如果有偏差,case语句的顺序是重要的,但是假设每个case都有一个break,所以顺序没有语义上的重要性。
例如,考虑优化时,case语句的顺序重要吗?是按升序排序更好,还是在任何排序中没有好处?编译器所执行的优化可能取决于case的顺序。由于任何编译器可能选择或不选择这样的优化,所以我不想在这里要求特定的语言或编译器。问题是什么可能会发生。
发布于 2014-06-01 20:17:10
答案不仅取决于语言,还取决于编译器,甚至取决于您选择的编译器设置。我在C++中看到了它的不同,这取决于我选择的gcc优化设置。
这是因为编译器可能选择将switch语句作为一系列测试来实现,就像一系列if / else语句一样,或者它可能选择将switch语句实现为跳转表。对于早期的测试,这一系列测试将更快,而跳转表通常都是同样快的,而不管顺序如何。
如果编译器将开关语句作为一系列测试来实现--并且没有重新排序--更可能的情况是,更早的情况会导致更快的代码。据我所知,将更可能的情况放在更早的位置通常不会导致更慢的代码,所以如果您的代码花费了大量时间执行这个switch语句,那么将更常见的情况放在更早的位置也不会有什么影响。
但是,如果您还没有分析代码,并且不知道开关语句是性能问题,那么最好使用对阅读代码的人来说最清楚的顺序来编写switch语句。
发布于 2014-06-01 20:34:07
根据这个基准来判断确实很重要:http://pastebin.com/rJMEunAT
第一种方法以0.2423秒结束,第二次以0.1654秒结束。
发布于 2014-06-01 20:36:56
对于那些禁止多个case子句匹配的语言,以及具有至少一些优化的编译器的语言,几乎可以肯定的是,用什么样的顺序编写case子句也不会有什么区别。
编译开关语句的常用方法有三种:
这三者都要求编译器重新排序子句。选择哪一个取决于语言、目标处理器、case子句中值的分布,以及可能的月亮相位。
https://stackoverflow.com/questions/23983964
复制相似问题