标题: C语言else if与switch怎么用比较合适?在多分支的时候,有没有效率说法? [打印本页]

作者: happy2058    时间: 2022-4-15 23:11
标题: C语言else if与switch怎么用比较合适?在多分支的时候,有没有效率说法?
请教一下,谢谢大家

例如:uchar Reuse_count=0;        //复用计时
bit Reuse=0;        //复用计时标志


void TM0_Isr() interrupt 1                                        //定时器0中断
{               
        Reuse=~Reuse;

}


void time_sharing()
{
        if(Reuse)
        {
                Reuse=~Reuse;
                Reuse_count++;
               
        }

}

void Reuse_time_sharing()
{
        if(Reuse_count==1)
               
                else if(Reuse_count==2)
               
                        else if(Reuse_count==3)
                                
                                else if(Reuse_count==4)
                                       
                                        else if(Reuse_count==5)
                                                
                                                else if(Reuse_count==6)
                                                        
                                                        else if(Reuse_count==7)
                                                               
                                                                else if(Reuse_count==8)
                                                                        
                                                                        else if(Reuse_count==9)
                                                                                
                                                                                else if(Reuse_count==10)
                                                                                       
                                                                                        else(Reuse_count==11)
                                                                                                                                                                                       
                                                                                                Reuse_count=0;
                                                                                       
}

void Reuse_time_sharing()
{
        switch(Reuse_count)
                case 1 : break;
                case 2 : break;
                case 3 : break;
                case 4 : break;
                case 5 : break;
                case 6 : break;
                case 7 : break;
                case 8: break;
                case 9 : break;
                case 10 : break;
                case 11 : Reuse_count=0;break;
        default;
}
在多分支的时候,有没有效率说法?



作者: dzbj    时间: 2022-4-16 01:15
我认为有 但具体哪个效率高不好说 要请懂汇编且研究过这个的大侠了 以前我也问过这问题 多数人回答的也比较模糊

我的理解是 if和else if组合 不是if的时候 会尝试第一个else if 再不是就尝试第二个 一直下去 直到有匹配的 那么假如每次都是11 就是每次都要全走一遍

switch可能在底层有个类似表的东西 先匹配分支数 如果在范围内直接跳到对应分支 不在范围就走default

理论上多分支的时候switch快 但实际上不知道 因为我不知道假如真有这么个表一类的东西  去比较它开销有多大 仅编译长度而言 分支少用if编译结果小 分支多用switch编译结果小
作者: 188610329    时间: 2022-4-16 03:16
先说一个小问题,
Reuse_count=0;
应该在 ++ 的函数里面重置,或者在 switch 的 default 里面重置, if 也是一样的道理。
你现在这样的写法, 后续会有很多隐患。

然后说一下,if, switch
执行效率来讲
如果,你都是连续数的话, switch  一定是优于 else if 的。
如果,非连续数,跳跃也没有规律的话,switch 和 else if 差不多, 但是优于纯 if, (这里说一下,你这里的判断,其实光用if 执行结果也没有区别但是效率的话,综合下来 else if 会高点)

编译后代码量而言,
看你选项多少,由于switch 需要建表,选项太少的话,switch 不划算。

可读性来讲,
个人觉得,只要选项超过3个,怎么看都是 switch 可读性更高。

作者: dzbj    时间: 2022-4-16 12:37
188610329 发表于 2022-4-16 03:16
先说一个小问题,
Reuse_count=0;
应该在 ++ 的函数里面重置,或者在 switch 的 default 里面重置, if  ...

为什么连续数switch比if高 我觉得应该是和有效条件的顺序有关吧 假如都是10个分支 有效分支2多 if就比switch高 有效分支10多 switch就比if效率高 如果没规律 那就是有效分支数小的多 if效率高 反之switch高 假如这个理解成立 用if的话把常用分支尽量往前写效率会高点 是么
作者: 名字不是重点    时间: 2022-4-16 13:13
一直以来个人都是是这么铸的:并列if超过3个,建议用switch,
if 是每一个if都要判断一次符合了再执行,是顺序执行的,而switch只判断一次,就跳到对应的语句去执行。类似查表。
如果理解没错的话,switch从代码可读性、逻辑结构方面都比if强的多,当然,并列if少的话,差别可能不明显,所以才在“3条以上if 用switch”这个说法。
欢迎拍砖!
作者: wangdanan    时间: 2022-4-16 14:17
可读性问题,没有效率之说

作者: 大脸盘子    时间: 2022-4-16 14:25
有时效果是一样的,根据情况而定
作者: Y_G_G    时间: 2022-4-16 15:14
个人感觉没有必要去管这个效率的
没有看过两个语句编译后的代码,但我敢肯定,这两者的效率相差绝对不会太大
在99.999%的情况下,用哪个都行,单纯的个人习惯而已
至少到现在为止,我没有碰到过非得用switch绝对不能用if,或者是非得用if而绝对不能用switch的情况
作者: hhh402    时间: 2022-4-16 15:23
这个有点钻牛角尖啦,现在单片机资源足够多,价格也足够便宜了,你觉得有可能用else if与switch其中一个单片机就可以运行,用另一个单片机就不可以运行吗?其实不需要纠结这个问题,你熟悉哪一个就用哪一个最终效果都一样。说到效率汇编更高,但是为什么用C的却比较多呢?主要是C更容易学,更多人熟悉。
作者: 188610329    时间: 2022-4-16 15:46
dzbj 发表于 2022-4-16 12:37
为什么连续数switch比if高 我觉得应该是和有效条件的顺序有关吧 假如都是10个分支 有效分支2多 if就比swi ...

刚才试了将近半个小时, 没有能够 “重现” (也许是KEIL版本,也许设置), 即:  没图没真相系列, 你或者其他人不信就当我胡说八道吧。
以下是我说的效率区别的基本差异点,你如果有幸“重现” 我当初的测试结果,希望能帮我存个图。
Switch 的选择,
当非连续的选择值的时候,是依据的 CJNE 来依次判断 跳转的,这个和  else if  编译后得到的结果是一样的。所以,这个时候, switch 仅仅是可读性高了。

当连续值选择的时候, switch 编译后 会 利用   JMP  @A+DPTR  来直接跳转到有效项。(这个我以前测试的时候出现过,前面想重现,始终编译不出来这个结果)  而这个跳转的效率 是远高于 CJNE 的依次判断跳转的。
不过,由于刚才始终重现不了这个编译结果,所以这个结论你就看看算了。就当switch 任何时候效率都和 else if 一样吧。
作者: univers    时间: 2022-4-16 16:26
else if一般喜欢用两个,而switch可以筛选好多个。
作者: dzbj    时间: 2022-4-16 21:44
188610329 发表于 2022-4-16 15:46
刚才试了将近半个小时, 没有能够 “重现” (也许是KEIL版本,也许设置), 即:  没图没真相系列, 你或者 ...

哦 收到 那我当效率一样吧 不管对错 你这回答是我看见的第一个肯定回答 上次我问的时候 得到的回答基本也都是不太确定 怎么说都有




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1