switch和ifelse效率

switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
具体地说,switch...case会生成一份大小(表项数)为最大case常量+1的跳表,程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址+表项大小*索引号),程序接着跳到此地址执行,到此完成了分支的跳转。

这里不考虑编译器的优化和条件传送(条件传送介绍),仅仅从跳转次数来比较两者的效率。

switch...case结构中有跳转表,输入的字符只要经过一次比较就可以正确的找到跳转分支,所以平均情况下跳转次数为1.

if...else结构如果有n个分支,分别记为n0,n1,n2,n3,...n(i-1),每个分支出现的概率假设未pi,分别为p0,p1,p2,p3,...p(i-1)。执行第一分支前不需要跳转,其它分支均需要跳转,执行第二个分支之前需要跳转一次,第三个分支需要跳转两次...需要跳转平均跳转的次数s为:  

如果>1,则此时if...else的效率是小于switch...case的,如果它的值小于1,此时if...else的效率高于switch...case。

    假设if...else分支的每个分支出现的概率相同,即1/n,上面的跳转次数的期望值可以改写为:

如果n=3,则期望的跳转次数为1,刚好与switch...case相同。由此,如果选择分支大于3的时候,选用switch...case结构效率会更高一些,而小于3时,选用if...else结构更好。

总结:在选择分支较多时,选用switch...case结构会提高程序的效率,但switch不足的地方在于只能处理case为常量的情况,if...else结构更加灵活一些,if...else结构可以用于判断表达式是否成立,比如if(a+b>c),if...else的应用范围更广,switch...case结构在某些情况下可以替代if...else结构。switch...case占用较多的代码空间,因为它要生成跳表,特别是当case常量分布范围很大但实际有效值又比较少的情况,switch...case的空间利用率将变得很低。

猜你喜欢

转载自blog.csdn.net/Eunice_fan1207/article/details/79696987