Which is better a switch statement or if-else if-else statement?
Possible Duplicates:
is “else if” faster than “switch() case” ?
What is the relative performance difference of if/else versus switch statement in Java?
我只是想知道是否一个更好(即更有效)。对我来说,似乎和语法不同。
- 哪种语言?有很多重复,包括stackoverflow.com/questions/767821/…
- @尼尔·巴特沃思:我觉得这个问题以前就有人问过,但是我问的几个快速搜索和建议对我没有帮助。就语言而言,我想我认为对任何语言来说,它都是相对相同的。如果我必须选择一个(或一些),我会说Java、C++和PHP。
编译器可以为某些类型的switch语句创建跳转表,这比像嵌套的if语句集那样计算每个元素更有效。这取决于开关的类型和您所使用的语言,但是许多C编译器在代码生成过程中都是这样的。
因此,简而言之,一个开关可以更有效,但这取决于您的特定用途。
- 编译器也可以从一组if语句创建这样的跳转表。
- 但要做到这一点需要大量的分析,我只是认为你不能指望会发生这种事。如果您以switch语句开始,那么您将"切换"所有谓词通用的值。在类似于C的简单情况下,它可能是一组整数标记,但它们都是整数标记。对于一组if语句,编译器必须派生出这个不变量。当然,如果有一个足够聪明的编译器,我们中的大多数人必须使用可预见的愚蠢编译器。
- 那些愚蠢的编译器是什么?
- 我有点开玩笑,但说实话,他们都是。你现在看到的是经典的SSC"足够聪明的编译器"的论点,这完全是一派胡言。仅仅因为优化是可能的,并且理论上可以进行分析来支持它,在实践中给出一个SSC是不值得的。货架上摆满了聪明的优化方案,它们从来没有投入生产,因为与收益相比,分析的成本太高了。switch语句优化甚至可能适合今天的描述,但是它仍然是一个历史上重要的优化。
- gcc/g++很容易做到这一点,也适用于非常重要的情况。似乎MSVC也这么做了。
- 哇,给我留下深刻印象。我将在这里和自己约会,但要追溯到15年前,当时我正在用一种使用C作为可移植程序集的语言开发动态方法分派的优化器,而事实并非如此。我们必须小心如何生成代码,以确保得到所需的结果。我想知道这是否是GCC中向SSA表单转移的结果?这有一种感觉,功能语言的编译器应该是正确的,并且在龙书风格的C编译器中是特殊的。我仍然不认为这是轻而易举的。
除非你有很多案子,否则没关系。如果您有很多情况,那么切换就更好了,因为编译器会为这些项目生成一个跳转表,因此查找是在O(1)而不是O(案例)中完成的。我还认为开关比if-else if链更可读。