由于编译器优化,Switch语句通常比等效的if-else-if语句更快(例如本文中描述的).
这种优化实际上如何运作?有没有人有一个很好的解释?
编译器可以在适用的地方构建跳转表.例如,当您使用反射器查看生成的代码时,您将看到对于字符串上的大型开关,编译器实际上将生成使用哈希表来分派这些代码的代码.哈希表使用字符串作为键,并将case
代码作为值委托给代码.
与大量的链式if
测试相比,它具有渐近更好的运行时间,并且即使对于相对较少的字符串实际上也更快.
这是一种轻微的简化,因为通常任何现代编译器都会遇到一个人if..else if ..
可以简单地转换为switch语句的序列,编译器也会如此.但是为了增加额外的乐趣,编译器不受语法的限制,因此可以在内部生成具有混合范围,单个目标等的"切换"语句 - 并且它们可以(并且确实)为交换机和if执行此操作. .else声明.
Anyhoo,对Konrad的答案的扩展是编译器可能会生成一个跳转表,但这不一定得到保证(也不是可取的).由于各种原因,跳转表会对现代处理器上的分支预测器做坏事,而表本身也会对缓存行为做坏事,例如.
switch(a) { case 0: ...; break; case 1: ...; break; }
如果编译器实际上为此生成了一个跳转表,那么if..else if..
由于跳转表会破坏分支预测,因此替代样式代码可能会慢一些.