打印
[技术问答]

if和Switch哪个效率高

[复制链接]
391|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
suzhanhua|  楼主 | 2023-3-15 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在很多人的概念里,switch 的执行效率是比 if/else 高的。依据就是很多人以为的,if/else 是用了多次比较判断,而 switch 是用的跳转表一次跳转。事实真的是这样吗?
考察以下几个例子,switch 改成 if/else 之后效率会变化很多吗?
【例1】
int x = GetIntValue();
switch(x) {
case 1: // do something
case 2: // do something
case 3: // do something
// ...
case 32: // do something
default: // do something
}

【例2】
int x = GetIntValue();
switch(x) {
case 1: // do something
case 12: // do something
case 123: // do something
// ...
case 123456789: // do something
default: // do something
}

【例3】
int x = GetIntValue();
switch(x) {
case 1: // do something
case 2: // do something
case 3: // do something
default: // do something
}

注意,跳转表其实是一个数组,并不是python/javascript “表驱动” 编程的那种哈希表。
对于第一个例子,case范围集中,用跳转表确实比用if/else 判断要好一些,编译器只需要使用一个大小为32的跳转表,跳转前判断一下是否在表范围内,然后查表一次就可以了。
对于第二种情况,case非常分散,如果使用跳转表的话,表要开多大、跳转要几次?如果我们希望仍然跳转一次,那么表的大小就要开的很大。实际上,编译器在面临这种情况时的处理方式是 —— 存入一个小的数组然后使用二分查找的方式来进行查询,实际查表 logN 次。
对于最后这种情况,case很少,编译器会直接转化成if/else来判断,没有区别。
有人曾经做过测试  100个case以内,if/else 和 switch 性能差别很小,超过 450 个case 才出现显著差距。实际上,现代编译器已经足够聪明,会根据case的情况,自动选择合适的方式来实现 switch,也会主动优化 if/else 的实现逻辑。
所以,我们编程的时候,不要着眼于这种小细节上的过度优化,处理好代码逻辑,然后选择相信编译器就好了。毕竟,代码99%的时间是用来给人读的,只有1%的时间是给机器来运行的。

使用特权

评论回复
沙发
sdlls| | 2023-4-4 13:45 | 只看该作者
switch的效率在一定条件下是比if else高的。

使用特权

评论回复
板凳
lihuami| | 2023-4-4 15:15 | 只看该作者
如果不是非常多选项的判断性能差异其实不大

使用特权

评论回复
地板
jonas222| | 2023-4-4 15:24 | 只看该作者
使用 switch 语句的效率更高一些  

使用特权

评论回复
5
kmzuaz| | 2023-4-4 15:30 | 只看该作者
if和switch哪个判断字符串快  

使用特权

评论回复
6
lzbf| | 2023-4-4 16:22 | 只看该作者
switch看起来比较简洁               

使用特权

评论回复
7
1988020566| | 2023-4-4 16:35 | 只看该作者
当分支较多时,当时用switch的效率是很高的。

使用特权

评论回复
8
jackcat| | 2023-4-4 16:42 | 只看该作者
switch用来比较基本类型,if只要是值为boolean的表达式都可以比较。

使用特权

评论回复
9
alvpeg| | 2023-4-4 16:54 | 只看该作者
在多路分支时用switch比if..else if .. else结构要效率高。

使用特权

评论回复
10
iyoum| | 2023-4-4 20:33 | 只看该作者
如果不是非常多选项的判断性能差异其实不大

使用特权

评论回复
11
zerorobert| | 2023-4-4 20:52 | 只看该作者
在多路分支时用switch比if..else if .. else结构要效率高。

使用特权

评论回复
12
uptown| | 2023-4-4 21:18 | 只看该作者
if和switch哪个判断字符串快  

使用特权

评论回复
13
yorkbarney| | 2023-4-4 21:26 | 只看该作者
听说switch的效率比if-else要高。  

使用特权

评论回复
14
jackcat| | 2023-4-4 21:46 | 只看该作者
switch和多个平行的if 效率是一样高的。

使用特权

评论回复
15
gygp| | 2023-4-6 16:55 | 只看该作者
听说switch的效率比if-else要高。  

使用特权

评论回复
16
mmbs| | 2023-4-6 18:01 | 只看该作者
switch和多个平行的if 效率是一样高的。

使用特权

评论回复
17
tpgf| | 2023-4-8 13:57 | 只看该作者
不能武断的说谁的效率高 得看是什么条件下的说法

使用特权

评论回复
18
nawu| | 2023-4-8 14:49 | 只看该作者
感觉跟逻辑执行的顺序  分支语句的概率都有关系

使用特权

评论回复
19
aoyi| | 2023-4-8 15:32 | 只看该作者
这两种语句的指令周期是一样的妈

使用特权

评论回复
20
zljiu| | 2023-4-8 15:55 | 只看该作者
这个不好判断 跟很多因素都有关系 甚至跟语句中判定条件的写法都有很大的关系

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

3560

帖子

2

粉丝