switch最大选项数目_随时随地学习C语言之3—if和switch哪个效率高?

之前学习C语言的时候,我经常有一个疑问,既然有if-else if-else结构的多分支选择语句,C语言为何还要制定switch这种多分支选择语句呢?直到两年前在分析ARM平台C语言反汇编代码的时候,才终于明白了switch-case这种结构存在的意义及价值。一句话来说,就是switch结构产生的机器代码更为精简、CPU执行起来更加高效。switch结构相对于if-else结构的执行效率,选择选项越多,领先越明显。今天,我们分析下ARM平台下(抱歉,我也只会ARM汇编),if-else结构和switch-case结构的差异和差距。
首先,下面两图是分别用if-else和switch-case结构编写的功能相同的两段代码:

1c9f9d9975ba97ba331ef1a22f6f138c.png


if-else 结构测试代码

562546f9eb1b4d7e0712aa7e416819d3.png


switch-case 结构测试代码
具体执行功能为:传入for循环次数、要判断的值,代码分别根据传入值进入相应代码块,然后继续循环,不做其他操作(其实上面代码可以进行优化,为了介绍方便,不做优化)。上述两段代码分别执行完成后看下程序的执行时间。首先上一下我电脑的配置图:

aad1a71b5ed873bb59f257a459df80e2.png


然后首先分别判断输入值为5,两段代码分别运行1亿次执行时间分别如下:

ddfea484418460c1729055c6b27da59f.png


这里大家只看时间值得user那行(第二行),看出差距来了吧,if结构耗费的时间是switch结构的3倍!下面我们再判断值9,分别运行1亿次看下结果:

f8bf71bc3f725baf63c72d2ee7313524.png


差距很明显,if结构对值9(if结构中排列靠后的值)比对值5(if结构中排列较前的值)判断时间明显长很多,而switch结构对数值在代码中的排列前后顺序似乎不是特别明显,if结构相对于switch结构的差距更大了!是什么原因造成的这种结果呢?下面我们在arm平台下,看下if结构和switch结构产生的反汇编代码是什么样子的?
我们通过下述命令(有关linux的命令,本号后续会推出《手把手教你学linux》系列,敬请关注),生成反汇编文件:

571ac96f1c0a53392cf1731b9995f20a.png


看下if结构和swtich结构生成的for循环汇编代码段是什么样子的:
if结构:

2e948035ec4d03dd61476728f8e2b207.png


if-else 结构反汇编结果
switch结构:

5db74042125a717b1b24a672d19b6c09.png


switch-case 结构反汇编结果
注意我标<<<<的几行,if结构的反汇编代码很长,在这里只截取了判断值0~3的一段,标<<<<的代码表示真正进行数值判断的汇编代码,可以看到:if结构的汇编代码(也就是机器所做的动作)是将接收到的实参值与程序当中的值(按值在代码中的排列顺序)挨个进行比较,这就是说,如果要比较的是9,if结构就需要比较10次才会命中。反过来看下switch结构,switch结构很巧妙的运用了“跳转”的思想,对任何一个case值的判断,和值在代码中的排列顺序无关,都会直接“跳转”到符合条件的case块中,所以,执行速度比if结构快得多,而且与值在代码中的排列顺序无关!反汇编代码可以看出,switch结构不仅比if结构执行效率高,占用空间也少!看图:

d6ddbc19c834d89af463b1f20cfd18ba.png


相信看了上面的介绍,你对if结构和switch结构的优劣性有自己的选择了吧。实际应用当中,我一般遵循以下编码“潜规则”:
1.凡是判断层级达到4层以上的,用switch结构。
2.凡是可能性最大的选项,放在if结构的最顶端。这个思想,也是ARM公司在ARM处理器多级流水线中加入“分支预测”功能的考量之一。
好啦,经过本文的介绍,if结构和switch结构的效率(执行效率、空间效率)你懂了吧~

最后

创一个小群,供大家学习交流聊天

如果有对学C++方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀。

我偶尔也会直播给大家手把手编程

也希望大家对学C++能够持之以恒

如果你想要学好C++最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给你推荐一个学习的组织:大牛小白C++组织 可以点击编程二字,可以直达

对编程感兴趣的朋友欢迎入住!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

onclick 获取img 里面的id_红魔5S游戏手机如何解锁bl获取第三方面具root权限

自从苹果阵营发布S系列&#xff0c;安卓系列也学习苹果的步伐&#xff0c;开始发布S系列&#xff0c;这不努比亚也发不了今年夏天的游戏手机&#xff0c;红魔5S游戏手机。红魔5S相对于红魔5其实从配置来看&#xff0c;三大件配置变化并不大&#xff0c;主要还是细节上的一些提升…

java 工厂模式的写法_设计模式-工厂模式

一、概述什么是工厂模式&#xff1f;工厂模式(Factory Pattern)是最常见的一种设计模式之一。它主要是提供一种创建对象的最佳方法&#xff01;为什么要学习工厂模式&#xff1f;与通过new来创建对象不同&#xff0c;使用工厂模式创建对象不会对客户端暴露创建逻辑&#xff0c;…

jackson 序列化_jackson序列化与反序列化的应用实践

作者 | zhouweixin 来源 | urlify.cn/iEbiAz66套java从入门到精通实战课程分享1 相关概念序列化: 把对象转换为字节序列的过程称为对象的序列化反序列化: 把字节序列恢复为对象的过程称为对象的反序列化2 序列化的作用用于把内存中的对象状态保存到一个文件中或者数据库中用于网…

java mqtt客户端_基于 t-io 实现一个 mqtt5 协议之 mica-mqtt

一、简介 MQTT 全称为 Message Queuing Telemetry Transport&#xff08;消息队列遥测传输&#xff09;是一种基于发布/订阅范式的“轻量级”消息协议&#xff0c;由 IBM 发布。目前使用比较广泛的就是 mqtt 3.1.1&#xff08;2014年制定&#xff09;&#xff0c;mqtt 5.0&…

java自我介绍_JAVA面试技巧之自我介绍

【如何进行自我介绍】自我介绍这个问题&#xff0c;不用多说了&#xff0c;面试必定会问&#xff01;如果想要在自我介绍的时候就能够打动面试官&#xff0c;吸引面试官对我们的兴趣&#xff0c;那么像我们这种接受过Java培训的程序员的自我介绍当然不能和应届生或者其他非技术…

java excel 操作 poi_Java使用apache poi进行excel相关操作

一.基本介绍1.1、Apache POI介绍Apache POI是一个可以进行微软的文档进行开源库&#xff0c;可以操作的文档类型包括word、ppt、excel、visio、outlook....本文主要针对Apache POI对excel的操作进行介绍&#xff0c;主要包括如何创建一个excel、录入数据、读取excel数据的方式。…

程序解析excel中的图片_产品日志丨支持导入Excel中的图片amp;批量修改后期实体字段...

本次安捷秀又迎来了一个大版本更新&#xff0c;除了大家呼声很高的「实体模块导入 Excel 」外&#xff0c;还有「批量编辑实体」&#xff0c;「支持右击修改」以及针对海外用户的「全页面支持英文」等功能的新增与优化&#xff0c;一起来看看吧。导入功能优化AGILESHOT&#xf…

java不同垃圾回收器_细述 Java垃圾回收机制→Types of Java Garbage Collectors

本文非原创&#xff0c;翻译自Types of Java Garbage Collectors在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的。和C语言不一样的是Java程序员不需要手动写垃圾回收相关的代码。这是使得Java如此流行&#xff0c;同时也是Java能帮助程序员写出更好的Java应…

js修改地址栏url_不同寻常的地址栏过渡

前几天&#xff0c;我在推特上看到这样一张图。原来地址栏还能这么玩&#xff0c;瞬间就觉得自己弱爆了。然后我决定去实现一下这个效果&#xff0c;然后做成一个库。画了一个晚上&#xff0c;终于做好了。这是最后的成果。这个库使用非常的简单。你只需要&#xff0c;yarn add…

kaggle数据集_ArXiv170万篇论文数据集上线Kaggle!

大数据文摘出品学术圈的朋友对ArXiv肯定都不陌生。在将近30年的时间里&#xff0c;ArXiv通过公开访问学术文章为公众和研究社区提供了一个更高效的学术成果沟通平台&#xff0c;从物理学到计算机科学的许多子学科&#xff0c;以及介于两者之间的所有内容&#xff0c;包括数学&a…

万能驱动xp离线版_教你用SC封装软件来封装XP系统

今天我们来讲解一下如何用SC软件来封装XP系统。今天的讲解只演示基本的SC封装软件&#xff0c;具体的封装前的准备工具&#xff0c;我们不进行讲解&#xff0c;当然前期的准备工作也是有很多&#xff0c;首先我们先要安装虚拟机软件&#xff0c;并在虚拟机上面安装好原版的XP系…

java dispo lock_java实现文件上传和下载(1)

原理&#xff1a; 使用html 的 标签&#xff0c;提交form 的几个属性必须为&#xff1a; methodpost encTypemultipart/form-data;组件:smartUpload或者commons fileuploadsmartUpload代码实现1。文件预览function showImage(obj){var strobj.value;$("#id").html(&q…

剪板机自动上下料_机器人联轴器,用于机器人自动化上下料

关注点击蓝字&#xff0c;关注我吧纤薄型机器人联轴器&#xff0c;可搬运重量范围从 1kg 至 1,000kg&#xff0c;用于高效机器人自动化机床上下料&#xff0c;多年来受到广泛认可。紧凑型微型联轴器适合于最近迅速发展的小型机器人应用领域。无人操作时工艺可靠性高模块的特殊混…

java 格式化 布尔型_Java基础篇(1)-格式化

本文目录&#xff1a;十进制数字格式化——DecimalFormat数字格式化基类——NumberFormat字符串格式化类——String.format()Linux输出格式化——printf1. 十进制数字格式化(DecimalFormat)decimal是对数字进行格式化&#xff0c;比如取2位小数&#xff0c;这是最常见的。Java提…

一旦有辞职念头就干不长了吗_每天都有辞职不想上班的冲动,你有吗?

我从大学毕业到今天&#xff0c;工作的时间将近10年了。直到现在&#xff0c;我还经常有辞职的想法。我觉得现在职场真的不好混&#xff0c;不如意的事情十之八九&#xff0c;有了辞职冲动是非常正常的&#xff0c;不必一上来就刻意的否定&#xff0c;或者克制。依照我的职场经…

mysql 序号_脚本搭建Nginx、Redis、MySql、Maven

当你面对一个全新的Linux系统时&#xff0c;是如何部署搭建项目环境呢&#xff1f;是否是一个一个软件安装呢&#xff1f;小编在往期文章中介绍了相关软件的安装方法&#xff0c;但是你是否发现不同的软件安装下来是否会出现问题呢&#xff1f;今天就教大家如何使用脚本一键安装…

mysql数据库子查询的使用_MySQL数据库使用子查询方式更新数据优化及思考

【环境介绍】云数据库MySQL 5.7【背景描述】业务需要&#xff1a;需要对16370077的表数据进行更新部分数据操作UPDATE P_MOXXXX_REXXXX SET FISAVAILABLE 1 WHERE FREG_ID IN (SELECT FREG_ID FROM P_MOXXXX_REXXXX_UPDATE_TEMP);【按照正常流程更新数据操作】使用archery的SQ…

业务中台建设与应用_容易网业务中台建设,助力企业数字化转型

“中台”这个概念自去年流行以来&#xff0c;至今仍然搅动着市场。期间&#xff0c;既有阿里、腾讯、百度、字节跳动、美团、滴滴等等头部互联网企业刮起的转型风&#xff0c;也有茅台延后中台签约、服装品牌CIO被开除等风波。尽管存在争议&#xff0c;但这不影响越来越多的企业…

java由大到小输出整数xvz_【视频+图文】Java经典基础练习题(三):输入3个整数,并将其由小到大输出...

java经典实例书店书畅想畅销书109.6元包邮(需用券)去购买 >目录https://www.cnblogs.com/Qpgshare/p/12588923.html一、视频讲解https://www.cnblogs.com/Qpgshare/p/12588923.html二、思路分析https://www.cnblogs.com/Qpgshare/p/12588923.html总结&#xff1a;https://ww…

压力测试过负载均衡_性能测试的方法有哪些?

压力测试&#xff1a;压力测试的关键字就是“极端”。通过对系统的极端加压&#xff0c;从而观察系统的所表现出来性能问题。再对此性能问题进行分析&#xff0c;从而达到系统优化的目的。所以压力测试就是一定要让系统出问题&#xff0c;如果系统没有出问题&#xff0c;那么压…