关于 while(1)和for(;;)效率问题的一点想法

这几天看到好友的文章关于while(1)和for(;;)效率的讨论,手痒说了两句。回头一寻思,自己也仅仅是判断。没有做不论什么实验,我们就看看这两种写法究竟有什么差别:

实验环境:IAR EWARM 5.2

我就随便在一个嵌入式项目上做文章了,首先projectC语言编译优化选择了None, 输出选择带汇编输出,输出的汇编文件和C语言相应上。

我在main函数里先用for(;;)写了个死循环,我们看看编译结果:

注意main.c生成了一个相应的main.s

能够看到,是用一条跳转指令直接替代的for (;;)。

再更改一下代码:

编译一下看结果:

while(1)的循环也是一句跳转指令所替代。

IAR EWARM 5.2下,可见 for(;;)和while(1)在未开优化代码级别下,全然一样。无不论什么差别。

我们再来看看 linux 下的arm-rtems4.9-gcc的结果:

我写了一个非常easy的代码:

先看看 while (1)的编译结果:

使用图形中的命令依次键入:

能够看到,while(1)循环已经变成了一个b .L7,并没有对1做推断。也是1条指令就搞定了。

我们再来看看for(;;)

键入下面命令:

查看结果例如以下:

两个结果是一样的。相同,gcc我也没有打开优化,假设须要看优化编译汇编结果的朋友们,能够使用gcc   -O2 -S test.c,也能够使用 gcc -Os -S test.c,-Os在嵌入式里用得多一些。没有优化的代码都是一样的,更不要说优化过的代码。

事实上这是个挺蛋疼的话题,C/C++本来就书写灵活,编译器的优化是千差万别,各有特点。这让我想起了,谭浩强老师写的《C语言程序设计》,我从一開始就不觉得谭老师这本书怎么样,但我也写不出更好的书来。能够肯定的是,对于书中 ++i, i++,以及运行结果和编译器高度相关的写法大量出现。害人啊。换一个编译器运行结果就不一样。实在是误人子弟。但这也是个不争的事实,那就是,规范写法,能够避免在多个编译器中移植带来的风险。

对于友人博客中所说,for(;;)和while(1)效率孰高孰低的讨论,我个人认为:

1.本身这两种写法无不论什么差别,和编译器高度相关,这个是我们有能力则关心,没能力关心也不须要太关心的事;

2.嵌入式代码对C/C++写法要求非常高,建议有基础的朋友们阅读阅读MISRA-C2004, 2008 和一些C++的国际级标准规范;

3.把基本的精力多放在代码的规范上,而不是代码的效率上。毕竟,单片机也使足够的快了,绝大部分情况下成立;假设你是做代码优化或者做算法的朋友们,建议多读读《计算机程序设计的艺术》一书,再掌握好一门汇编语言。将会有极大的用处。

时间: 2024-12-24 06:35:53

关于 while(1)和for(;;)效率问题的一点想法的相关文章

ArcGIS地图文档MXD效率慢的一点建议(二)

经常有用户询问,我的MXD图层比较多,而且配置好了相关的符号,但是我的服务器更换了一下,而且两个服务器的要素类名称都是一样的,我想配置一下新的数据源,而且我的这个MXD已经连接不到原来的数据源了,打开这个MXD,要花费很长时间,请问有什么可以避免的么? 因为这种情况下,打开MXD的时候,会查询数据源,特别是SDE数据源,如果找不到MXD记录的相关参数信息,系统会默认一直在找相应的IP(也可以理解一直在Ping),而且也会寻找你们局域网里面的所有机器,那么如果数据图层比较多,这个时间肯定会比较长的

关于提高python程序执行效率的思路和想法

相比编译型语言(C系列)python胜在简介的语法和优雅的动态编程体验,但是在执行效率上,python有解释性语言先天的劣势——执行效率较低,为了让编写出的程序获得更快的执行效率,开启此文章. python将编写好的程序源代码转为字节码,然后用PVM进行解释执行. 方法一:对代码进行优化 循环体中避免无用的赋值和计算,这在所用的编程中是通用的,而且效果显著. 第三方库的选择,比如对于html文本处理,正确使用 re 的解析速度显然会高于BeautifulSoup. 方法二:使用编译优化工具 Py

(同事的原创)关于效率优化的一点工作心得

文是单位同事胡计平的一个关于效率优化的总结,内容很实用,转贴到blog里,以备自己日后查看,也希望能对更多的人有所帮助 最近写一程序,跟效率优化打上了交道,把其中的体会写下来,供大家讨论分享,我想效率优化工作可以分为如下几个步骤: (1)查找影响效率的瓶颈之处:定位的方法当然是使用时间函数,一般精确的使用GetTickCount就可以,非常精确的使用 function GetCycleCount: Int64;asm  RDTSC;    //得到当前CPU的时钟周期数.end; 想必这个知识大

关于工作效率自己的一点见解

对于一个刚刚入职的技术人员,BOSS对你能力的评估主要在两个方面: 一.完成需求的速度 二.完成需求的质量 而这两点取决于你对项目需求是否了解清晰以及你当前的技术是否能胜任这个需求. 为了以上两点,你可以把一天的时间都放在这个需求上,但仔细想一下其实这个时间也是有极限的,大概是14个小时. 但14个小时是放在这个需求的总时间,这时候工作效率就非常重要了. 对于提高工作效率的见解: 一.尽力减少碎片化时间,在一段时间内集中精力完成一个需求或者需求内的子需求,因为再切回到原来需求上是有时间开销的.

if else和switch case那个效率更高一点

switch...case写法: switch (表达式){ case 值1 : 语句1 break; case 值2 : 语句2 break; ... default : 语句n break; } if...else写法: if(boolean){ }else if(boolean){ }else if(boolean){ }else{ } 由此看来,switch有点以空间换时间的意思,而事实上也的确如此.1.当分支较多时,当时用switch的效率是很高的.因为switch是随机访问的,就是确

如果提高工作效率(转载)

效率由心生,快速提高工作效率秘诀 来源: Veda原型  发布时间: 2012-03-19 15:13  阅读: 2348 次  原文链接   全屏阅读  [收藏] 现代人都很忙,但忙的可能没有效率,可能在"忙人"摸象,也就是瞎忙.也许你的效率可以提升20倍,也许你的激情和潜能可以提升10倍!秘诀就在于目标管理.时间管理.精力管理.如何在短时间内完成更多的事情.如何从痛苦的修行中悟道.如何尊崇内心的自由.如何有更多的时间去享受生活.如何动态平衡工作和生活?!这里有能大大提升工作效率和时

开发者 发展 8 效率 web服务 如何学习

Web服务的方式有哪几种面向服务架构的技术 SOAP - 一个基于 XML 可扩展消息信封格式,需同时绑定一个传输用协议.这个协议通常是 HTTP 或 HTTPS,也可以是 SMTP 或 XMPP. WSDL - 一个 XML 格式文档,用以描述服务端口访问方式和使用协议的细节.通常用来辅助生成服务器和客户端代码及配置信息. UDDI - 一个用来发布和搜索 Web服务的协议,应用程序可借由此协议在设计或运行时找到目标 Web 服务. W3C 负责 XML.SOAP 及 WSDL:OASIS 负

Linux探秘之I/O效率

一.文章来由 最近看了<UNIX环境高级编程>,对以前比较模糊的一些知识结构又做了进一步的加强,特别是前两章讲到不带缓冲的文件I/O和带缓冲的标准I/O,对read.write.fread.fwrite.printf等等这些函数又有了新的认识.一个很大的感受是我们很多时候编程开发都只注重上层逻辑,虽然一个项目接一下项目,看上去做了不少事,但是夜深人静时仔细一想,究竟我们是否真正掌握了这些知识点,对于每一个知识点实现的机制我们是否能完整地说出来.这些东西最能体现一个人的基础知识是否扎实,我发现互

atitit.提升开发效率---mda 软件开发方式的革命

atitit.提升开发效率---mda 软件开发方式的革命 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和其实现相分离 2 3. 目前的问题模型和代码不同步 2 4. MDA的历史及其由来 2 5. MDA的三个主要目标是:轻便性. 互操作性和可重用性. 3 6. MDA跟代码生成的不同 3 7. 问题:也许MDA不过是已有的Case Tools的"昙花一现" 3 8. 实际的效率提升 3 9. Mda在嵌入式系统的成功 4 10. 我的总结:::基于伪码生