27

我在某处读到该switch语句使用“二进制搜索”或一些排序技术来准确选择正确的案例,与 else-if 阶梯相比,这提高了它的性能。

而且,如果我们按顺序给出案例,开关是否工作得更快?是这样吗?您能对此提出宝贵的建议吗?

我们在这里讨论了同样的问题,并计划作为一个问题发布。

4

4 回答 4

21

实际上,如何switch在代码中实现语句取决于编译器。

但是,我的理解是在合适的时候(也就是比较密集的情况),使用跳转表。

这将意味着类似:

switch(i) {
  case 0: doZero(); break;
  case 1: doOne();
  case 2: doTwo(); break;
  default: doDefault();
}

最终会被编译成类似的东西(可怕的伪汇编器,但我希望它应该很清楚)。

load i into REG
compare REG to 2
if greater, jmp to DEFAULT
compare REG to 0
if less jmp to DEFAULT
jmp to table[REG]
data table
  ZERO
  ONE
  TWO
end data
ZERO: call doZero
jmp END
ONE: call doOne
TWO: call doTwo
jmp END
DEFAULT: call doDefault
END:

如果不是这种情况,还有其他可能的实现允许某种程度的“优于一系列条件”。

于 2012-12-28T09:53:46.180 回答
11

如何实现 swtich 取决于您拥有什么值。对于范围相近的值,编译器一般会生成一个跳转表。如果这些值相距甚远,它将生成一个链接分支,使用类似于二进制搜索的方法来找到正确的值。

switch 语句的顺序无关紧要,无论您的顺序是升序、降序还是随机顺序,它都会做同样的事情——就您想做的事情而言,做最有意义的事情。

如果不出意外,switch 通常比 if-else 序列更容易阅读。

于 2012-12-28T10:05:01.100 回答
1

在一些谷歌搜索中,我发现了一些有趣的链接,并计划发布作为我问题的答案。 http://www.codeproject.com/Articles/100473/Something-You-May-Not-Know-About-the-Switch-Statem

欢迎评论。。

于 2012-12-28T10:01:23.070 回答
0

尽管它可以通过多种方式实现,但这取决于语言设计者想要如何实现它。一种可能的有效方法是使用 Hash Maps 将每个条件(通常是整数)映射到要评估的相应表达式,然后是跳转语句。其他解决方案也可能会起作用,因为 switch 具有有限的条件,但有效的解决方案是使用哈希映射

于 2021-05-09T13:37:14.020 回答