switchif-else相比

switchif-else相比,由于使用了Binary Tree算法,绝大部分情况下switch一点,除非是if-else的第一条件就为true.说实话  我也没有深入研究过这问题的根源只是在实际开发中  没有人会去用很多很多else if的都是用 switchcase 的  后者比较清晰  给人感觉就是一脑子很清楚的人写出来的东西至于效率的本质  就让大企鹅去操心吧
编译器编译switch与编译if...else...不同。不管有多少case,都直接跳转,不需逐比较查询。
昨天发现了一本叫做CSAPP的书,终于找到了关于switch问题的解答。

这是一段C代码: 
/* $begin switch-c */ 
int switch_eg(int x) 

    int result = x;

switch(x) {

case 100: 
    result *= 13; 
    break;

case 102: 
    result += 10; 
    /* Fall through */

case 103: 
    result += 11; 
    break;

case 104: 
    case 106: 
    result *= result; 
    break;

default: 
    result = 0;       
    }

return result; 

/* $end switch-c */

用GCC汇编出来的代码如下: 
    .file    "switch.c" 
    .version    "01.01" 
gcc2_compiled.: 
.text 
    .align 4 
.globl switch_eg 
    .type     switch_eg,@function 
switch_eg: 
    pushl %ebp 
    movl %esp,%ebp 
    movl 8(%ebp),%edx 
    leal -100(%edx),%eax 
    cmpl ,%eax 
    ja .L9 
    jmp *.L10(,%eax,4) 
    .p2align 4,,7 
.section    .rodata 
    .align 4 
    .align 4 
.L10: 
    .long .L4 
    .long .L9 
    .long .L5 
    .long .L6 
    .long .L8 
    .long .L9 
    .long .L8 
.text 
    .p2align 4,,7 
.L4: 
    leal (%edx,%edx,2),%eax 
    leal (%edx,%eax,4),%edx 
    jmp .L3 
    .p2align 4,,7 
.L5: 
    addl ,%edx 
.L6: 
    addl ,%edx 
    jmp .L3 
    .p2align 4,,7 
.L8: 
    imull %edx,%edx 
    jmp .L3 
    .p2align 4,,7 
.L9: 
    xorl %edx,%edx 
.L3: 
    movl %edx,%eax 
    movl %ebp,%esp 
    popl %ebp 
    ret 
.Lfe1: 
    .size     switch_eg,.Lfe1-switch_eg 
    .ident    "GCC: (GNU) 2.95.3 20010315 (release)"

在上面的汇编代码中我们可以很清楚的看到switch部分被分配了一连续的查找表,switchcase中不连续的部分也被添加上了相应的条目,switch表的大小不是根据case语句的多少,而是case的最大值的最小值之间的间距。在选择相应 的分支时,会先有一cmp子句,如果大于查找表的最大值,则跳转到default子句。而其他所有的case语句的耗时都回事O(1)。

相比于if-else结构,switch的效率绝对是要高很多的,但是switch使用查找表的方式决定了case的条件必须是一连续的常量。而if-else则可以灵活的多。

可以看到if-else只是单纯地一接一比较,效率比较低 
可以看出,switch的效率一般比if-else高 
switch   效率高,     从汇编代码可以看出来   
switch   只计算一次值   然后都是test   ,   jmp,     
if...else   是每条件都要计算一遍的.  
switch的效率与分支数无关   
当只有分支比较少的时候,if效率比switch高(因为switch有跳转表)   
分支比较多,那当然是switch

转载于:https://www.cnblogs.com/jilodream/archive/2012/10/15/4222782.html

关于if else 和 switch 的区别 究竟哪个更快相关推荐

  1. python io密集 多线程_python多进程和多线程究竟谁更快(详解)

    python3.6 threading和multiprocessing 四核+三星250G-850-SSD 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很多都说python多进程更快,因为 ...

  2. 2020移动apn接入点哪个快_手机资讯:5G 网络和现在 iPhone 使用的 Wi-Fi 有什么区别速度会更快吗...

    如今使用IT数码设备的小伙伴们是越来越多了,那么IT数码设备当中是有很多知识的,这些知识很多小伙伴一般都是不知道的,就好比最近就有很多小伙伴们想要知道5G 网络和现在 iPhone 使用的 Wi-Fi ...

  3. Java VS Go,微服务究竟谁更快?

    作者 | 程序猿DD   责编 | 张文 头图 | CSDN 下载自视觉中国 Java 微服务能像 Go 微服务一样快吗?这是我最近一直在思索的一个问题. 去年 8 月份的 the Oracle Gr ...

  4. 无线标准802.11ac 和 802.11ax到底有什么区别?哪个更快?

    802.11ac 和 802.11ax 是目前来说比较常用的无线 (WiFi) 技术标准,最常见的无线标准称为 802.11ac,也就是 WiFi 5,然而,在 2019 年底,推出了 802.11a ...

  5. java switch语句与switch表达式区别及使用

    1.switch语句 与if/else语句不同,switch语句可以有许多可能的执行路径.switch可用于基本类型byte.short.char和int.它们各自的包装类型(byte.short.C ...

  6. 初级前端与高级前端的区别究竟有多大?

    随着互联网技术的飞速发展,前些年,"前端"一词变得越来越火, 不管是在网上还是日常生活中总是听到这个领域和非这个领域的人在讨论它. 有的人甚至跨行转做前端,这不仅是因为它的薪资符合 ...

  7. prompt和instruct的区别究竟是什么

    GPT的爆火是从ChatGPT开始,ChatGPT其实是在GPT3的基础上通过instruct数据微调而来. 注意这里引入了instruct,我们又时常需要给语言模型写prompt,那instruct ...

  8. python 字符串操作速度_强者一出,谁与争锋?与Python相比,C+的运行速度究竟有多快?|python|编程语言|字符串|示例|算法...

    对于数据科学家而言,热爱Python的理由数不胜数.但你是否也曾问过这样的问题:Python和C或C++等更专业的低级编程语言究竟有何不同呢?我想这是很多数据科学家或者Python用户曾经问过或者将来 ...

  9. 公募VS披荆斩棘的私募,究竟哪个更赚钱 ?

    今年,是股票型基金蓬勃发展的一年.截至今年6月份,公募股票型和偏股混合型基金总规模达4.2万亿,突破2007年高点,再创历史新高. 与其同时,股票私募的扩张速度也毫不逊色,6月底,私募证券基金管理规模 ...

  10. 魅族16s是Android几,魅族16s,小米9,Reno三大安卓旗舰对飚,究竟哪个更值?

    原标题:魅族16s,小米9,Reno三大安卓旗舰对飚,究竟哪个更值? 最近很多朋友对于购买旗舰手机都有着迷惑.毕竟现在旗舰机种类太多,大部分配置也都相差无几,比较有代表性的就是目前风头正盛的魅族16s ...

最新文章

  1. 【控制】《现代控制理论》谢克明老师-第7章-线性系统的状态估计
  2. 阿基米德椭圆规原理,你看懂了吗?
  3. linux 命令api,linux命令行下字典,使用有道API
  4. 【LeetCode 2】两数相加(链表)
  5. Java 时间和字符换的处理
  6. python没基础能自学吗-需要自学python吗?大概多久能学会?
  7. IDEA 更换主题样式
  8. 数据中心服务器巡检方案,数据中心巡检机器人方案.pdf
  9. 学报格式和论文格式一样吗_求《浙江大学学报》的论文格式要求 - 论文投稿 - 小木虫 - 学术 科研 互动社区...
  10. 如何高效率安排你的时间?Mac精品日程管理软件推荐
  11. 怎样轻松批量追踪拼多多快递?
  12. librosa 语音库(二)STFT 的实现
  13. 提高scrapy的爬取速度
  14. 读《天才在左 疯子在右》有感
  15. Mac Apache php 配置域名
  16. 浏览器火狐3.0发布之盛况
  17. VOS3000软交换怎么样,云服务器可以配置吗?
  18. 启动车子温车_冷车和热车难打火可以不修,但温车不打火必须得修
  19. 关于亚马逊测评自养号IP的使用
  20. python的SMTP

热门文章

  1. 对象可以创建数组吗_女生没房可以吗?男生有多在意结婚对象的家境?答案很现实...
  2. 仿复制粘贴功能,长按弹出tips的实现
  3. 0108 点击时 大小图
  4. eclipse.ini
  5. Android真武剑之PopupWindow之三国杀
  6. Source Insight 生成函数调用关系图
  7. 012的悲剧终于预言了
  8. Java图形组件 OpenSwing
  9. Mac Source Tree 切换账户
  10. Word:不显示图片 + 清空“最近使用的文档”列表