提问: ifelse 语句和 switch 语句,除了 if 可以更加具体的判断外,两者还有什么区别呢,各自在什么情况下使用更好

2019-06-25 10:22:26 +08:00
 hyd8323268

提问: ifelse 语句和 switch 语句,除了 if 可以更加具体的判断外,两者还有什么区别呢,各自在什么情况下使用更好

5102 次点击
所在节点    程序员
42 条回复
yedanten
2019-06-25 15:07:21 +08:00
可以写个小 demo,然后逆向一下就知道了。这里写两个 demo 给 LZ 解释一下。
两个 demo 编译都是采用 gcc -O0 的方式
先看 if 的,代码如下。
![ifcode]( https://imgur.com/3Nc8Nzl)

在看逆向之后的结果
![ifreverse]( https://imgur.com/6IkQxQ2)
和代码所写的判断顺序一样,逐个判断。

在看 switch 的,代码如下。
![switchcode]( https://imgur.com/9PBOKmz)

逆向结果
![switchreverse]( https://imgur.com/Ox2qH4C)
第一次判断和数值 2 对比,后续采用大于还是小于,进行二分法逐层判断。

所以在写 C/C++的时候,关闭编译器优化的情况下,如果判断分支比较多,采用 switch 效率会更高。

然后在吐个槽……分支真的那么多的时候,是不是应该考虑优化业务逻辑了
yedanten
2019-06-25 15:08:32 +08:00
@yedanten 摔,为什么 markdown 格式发图失败了……
hyd8323268
2019-06-25 15:58:45 +08:00
@shendaowu 感谢 晚上回去看看
hyd8323268
2019-06-25 16:01:21 +08:00
@yedanten 兄弟你链接挂了
labnotok
2019-06-25 16:05:16 +08:00
由于每个 case 的出现概率不同,
if else 可以利用先验知识优化,
达到实际中的最小复杂度。
yedanten
2019-06-25 16:08:25 +08:00
@hyd8323268 额,这个图床要搭梯子……
psychoo
2019-06-25 16:37:03 +08:00
试了一下 C 语言 1 亿次的 11 条件 if 和 switch,if 比 switch 快一点,不知原因
wym7223645
2019-06-25 17:10:52 +08:00
java 项目,我们项目要求你使用 if-else 不建议使用 switch,原因就是 业务变化太快,分分钟的加上复杂条件
jaskle
2019-06-25 19:14:35 +08:00
其实吧,与语言有关,如果是脚本类还是 if 吧,Java 判断量多的可以用用 switch,c 系的只有数值接近或递增规律明显才会用跳表。总结:哪个方便用哪个,除非你的性能瓶颈不在 io 上,这点性能损耗也就 12306 能用上
secondwtq
2019-06-25 19:40:37 +08:00
secondwtq
2019-06-25 19:43:07 +08:00
@yedanten 为什么要关优化?
你可以去看下 LLVM 的代码,大块的 switch 满天飞
dremy
2019-06-25 19:56:54 +08:00
自以为比编译器聪明系列
yedanten
2019-06-25 20:54:03 +08:00
@secondwtq 这不是为了给楼主演示 if 和 switch 在编译后是怎么执行的,才关掉优化嘛,开着优化那反汇编出来的都是二分法判断。
weixiangzhe
2019-06-25 22:23:42 +08:00
python 就没有 switch 吧,还是看语言吧
pan519
2019-06-26 01:41:14 +08:00
小白也有类似疑问。。。switch 不是后面只能写 int string 类的嘛?
csys
2019-06-26 02:19:51 +08:00
取决于有没有模式匹配
msg7086
2019-06-26 03:11:09 +08:00
怎么写舒服怎么写。这种细节上的效率优化带来的性能提升太小了。真的遇到性能瓶颈了再做 Profiling 不迟。
hallwoodzhang
2019-06-26 05:04:49 +08:00
switch 语句会直接通过条件查表,然后通过 offset 跳到对应指令,if 则没这么快
zwh2698
2019-06-26 07:12:30 +08:00
科普编译器跳转表,很多 switch 语句编译器在后期都把它转成跳转表,而一般的 if 语句就是汇编的大于等于小于跳转,两个执行的代码多少不同。关键来了:现代编译器对 if 语句一定多个一起的也会做成跳转表,比较少的,就在 peephole 优化阶段删掉更多的无用语句,也不会差很多。
Mohanson
2019-06-26 09:32:05 +08:00
语义不同

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/577160

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX