当前位置:  开发笔记 > 编程语言 > 正文

如果与Switch Speed相对

如何解决《如果与SwitchSpeed相对》经验,为你挑选了2个好方法。

由于编译器优化,Switch语句通常比等效的if-else-if语句更快(例如本文中描述的).

这种优化实际上如何运作?有没有人有一个很好的解释?



1> Konrad Rudol..:

编译器可以在适用的地方构建跳转表.例如,当您使用反射器查看生成的代码时,您将看到对于字符串上的大型开关,编译器实际上将生成使用哈希表来分派这些代码的代码.哈希表使用字符串作为键,并将case代码作为值委托给代码.

与大量的链式if测试相比,它具有渐近更好的运行时间,并且即使对于相对较少的字符串实际上也更快.


关于哈希表的好回答,有趣.
在某些情况下,它们也会转换为树比较.推理有点复杂,但基本上归结为表间接中性现代cpu跳转目标缓冲区,因此消除了分支预测器.我模糊地回忆起关于交换机代码生成的GCC会议上的一篇论文.

2> olliej..:

这是一种轻微的简化,因为通常任何现代编译器都会遇到一个人if..else if ..可以简单地转换为switch语句的序列,编译器也会如此.但是为了增加额外的乐趣,编译器不受语法的限制,因此可以在内部生成具有混合范围,单个目标等的"切换"语句 - 并且它们可以(并且确实)为交换机和if执行此操作. .else声明.

Anyhoo,对Konrad的答案的扩展是编译器可能会生成一个跳转表,但这不一定得到保证(也不是可取的).由于各种原因,跳转表会对现代处理器上的分支预测器做坏事,而表本身也会对缓存行为做坏事,例如.

switch(a) { case 0: ...; break; case 1: ...; break; }

如果编译器实际上为此生成了一个跳转表,那么if..else if..由于跳转表会破坏分支预测,因此替代样式代码可能会慢一些.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有