打印
[MM32软件]

if和switch的执行效率问题

[复制链接]
3465|65
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pl202|  楼主 | 2023-10-30 20:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在很多人的概念里,switch 的执行效率是比 if/else 高的。依据就是很多人以为的,if/else 是用了多次比较判断,而 switch 是用的跳转表一次跳转。事实真的是这样吗?
考察以下几个例子,switch 改成 if/else 之后效率会变化很多吗?
【例1】
int x = GetIntValue();switch(x) {case 1: // do somethingcase 2: // do somethingcase 3: // do something// ...case 32: // do somethingdefault: // do something}
【例2】
int x = GetIntValue();switch(x) {case 1: // do somethingcase 12: // do somethingcase 123: // do something// ...case 123456789: // do somethingdefault: // do something}
【例3】
int x = GetIntValue();switch(x) {case 1: // do somethingcase 2: // do somethingcase 3: // do somethingdefault: // do something}CPP 复制 全屏
注意,跳转表其实是一个数组,并不是python/javascript “表驱动” 编程的那种哈希表。
对于第一个例子,case范围集中,用跳转表确实比用if/else 判断要好一些,编译器只需要使用一个大小为32的跳转表,跳转前判断一下是否在表范围内,然后查表一次就可以了。
对于第二种情况,case非常分散,如果使用跳转表的话,表要开多大、跳转要几次?如果我们**仍然跳转一次,那么表的大小就要开的很大。实际上,编译器在面临这种情况时的处理方式是 —— 存入一个小的数组然后使用二分查找的方式来进行查询,实际查表 logN 次。
对于最后这种情况,case很少,编译器会直接转化成if/else来判断,没有区别。

使用特权

评论回复
沙发
tpgf| | 2024-1-2 14:13 | 只看该作者
这个是不是和分支的数量有关系啊

使用特权

评论回复
板凳
nawu| | 2024-1-2 14:42 | 只看该作者
从逻辑上来讲 我更加喜欢使用if语句

使用特权

评论回复
地板
gwsan| | 2024-1-2 15:36 | 只看该作者
这个怎么判定编译器是否转换了呢

使用特权

评论回复
5
tfqi| | 2024-1-2 16:18 | 只看该作者
有没有一种情况就是编译器将if语句转换为switch语句呢

使用特权

评论回复
6
zljiu| | 2024-1-2 23:04 | 只看该作者
这种情况下 编译器还能自动转换?

使用特权

评论回复
7
aoyi| | 2024-1-2 23:36 | 只看该作者
对于比较复杂的判断选择  我们可以把两者结合起来使用

使用特权

评论回复
8
victory007| | 2024-1-3 13:56 | 只看该作者
谢谢博主分享

使用特权

评论回复
9
wwppd| | 2024-1-5 09:35 | 只看该作者
执行效率主要取决于条件的数量和复杂性。

使用特权

评论回复
10
wwppd| | 2024-1-5 16:38 | 只看该作者
switch对于处理连续整数或者枚举类型的变量尤为高效

使用特权

评论回复
11
jimmhu| | 2024-1-5 16:55 | 只看该作者
不意味着switch语句总是比if语句快,因为switch语句的每个case都需要进行判断,如果case的数量很多,那么总的判断次数可能会超过if语句。

使用特权

评论回复
12
cemaj| | 2024-1-5 17:07 | 只看该作者
在一些存储容量较小的设备上运行程序时,可能需要权衡效率和代码空间的大小。

使用特权

评论回复
13
qiufengsd| | 2024-1-5 19:27 | 只看该作者
if语句的分支指令是条件指令(如JE、JG等),而switch语句的分支指令是跳转指令(如JMP等)。跳转指令通常比条件指令具有更高的执行效率。

使用特权

评论回复
14
uptown| | 2024-1-5 19:45 | 只看该作者
实际运行时的效率差异可能并不显著。

使用特权

评论回复
15
averyleigh| | 2024-1-6 17:41 | 只看该作者
switch语句适用于条件较多的情况,特别是当有多个互斥的条件时。switch语句的执行效率主要取决于case的数量,因为每个case都需要进行判断。但是,switch语句的优点是代码简洁,易于阅读。

使用特权

评论回复
16
gygp| | 2024-1-6 17:55 | 只看该作者
if语句在编译后通常会产生一个分支树,它通过比较条件变量的值来决定应该执行哪一段代码。如果条件复杂或者有多个else if分支,那么这个树可能会变得相当庞大。

使用特权

评论回复
17
wwppd| | 2024-1-6 18:23 | 只看该作者
switch语句在执行效率上通常优于if语句,尤其是在处理多个分支选择时。

使用特权

评论回复
18
youtome| | 2024-1-6 18:54 | 只看该作者
在执行过程中,处理器会尝试预测下一个指令的地址,以便预先加载到缓存中。对于switch语句,处理器可以更容易地预测分支的目标地址,因为这些地址是离散的。而对于if-else语句,预测可能会更困难,因为分支目标地址取决于多个条件。

使用特权

评论回复
19
elsaflower| | 2024-1-6 19:05 | 只看该作者
当条件包含复杂的布尔表达式,或者需要进行范围检查等无法用单一case标签表示的情况,if-else结构可能更自然、灵活,但执行效率可能低于switch。

使用特权

评论回复
20
deliahouse887| | 2024-1-6 19:23 | 只看该作者
if语句是一种条件分支语句,用于根据某个条件来选择执行特定的代码块。当条件满足时,执行相应的代码块;否则,跳过该代码块。if语句的执行效率取决于条件判断的复杂性和分支的数量。如果条件判断很简单且分支数量较少,那么if语句的执行效率较高。然而,如果条件判断复杂且分支数量较多,那么if语句的执行效率可能会降低。

使用特权

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

本版积分规则

22

主题

2727

帖子

3

粉丝