我到目前为止还不是一个核心程序员,主要是小型Python脚本,我写了几个分子动力学模拟 . 对于真正的问题:switch语句有什么意义?你为什么不能只使用if-else语句?
感谢您的回答,如果之前有人询问过,请指向我的链接 .
EDIT
S.Lott指出,这可能是问题的重复If/Else vs. Switch . 如果你想关闭然后这样做 . 我将把它留待进一步讨论 .
我到目前为止还不是一个核心程序员,主要是小型Python脚本,我写了几个分子动力学模拟 . 对于真正的问题:switch语句有什么意义?你为什么不能只使用if-else语句?
感谢您的回答,如果之前有人询问过,请指向我的链接 .
EDIT
S.Lott指出,这可能是问题的重复If/Else vs. Switch . 如果你想关闭然后这样做 . 我将把它留待进一步讨论 .
8 回答
switch结构更容易转换为jump (or branch) table . 当case标签靠近时,这可以使switch语句比if-else更有效 . 我们的想法是在内存中依次放置一堆跳转指令,然后将值添加到程序计数器中 . 这将使用添加操作替换一系列比较指令 .
下面是一些非常简化的伪装配示例 . 首先,if-else版本:
接下来是交换机版本:
您可以看到生成的汇编代码更紧凑 . 请注意,需要以某种方式转换该值以处理除1,2和3之外的其他值 . 但是,这应该说明这个概念 .
切换可以是optimized by compile r - 您将获得更快的代码 .
在处理可枚举类型时,我发现它更优雅 .
总结一下switch语句给你 performance code elegance :)
以下是一些有用的链接:
speed comparison of switch vs if/else in C#
Feedback-Guided Switch Statement Optimization(pdf描述切换语句优化)
为表达性,switch / case语句允许您将多个案例组合在一起,例如:
为了提高性能,编译器有时可以将switch语句优化为跳转表 .
我忽略了这种低级优化通常不重要,可能与编译器不同 .
我要说的主要区别在于可读性 . if / else非常灵活,但是当你看到一个开关时,你就知道所有的测试都是针对同一个表达式的 .
除了在.NET中提到的其他代码可读性和优化之外,您还可以打开枚举等功能
通过几个案例(故意遗漏休息声明)的能力可能是有用的,并且正如一些人已经说过它也更快 . 也许最重要也是最不重要的考虑因素是,它只是制作比if / else更漂亮的代码 . :)
某些编译器可以优化开关"Better" . 在某些语言中使用switch语句存在缺陷 . 在Java中,交换机无法处理字符串,在VB2005中,switch语句不能用于单选按钮 .
Switch可以更快,更容易阅读,If-Then更通用,可以在更多地方使用 .
唯一的时间切换可以更快,当您的案例值是常量,而不是动态或以其他方式派生时,并且当案例数明显大于计算哈希到查找表中的时间 .
在大多数引擎(包括Chrome的V8引擎)上编译执行程序集的Javascript的例子是,在常见情况下执行开关语句的速度要慢30%-60%:http://jsperf.com/switch-if-else/20