有两个循环语句:

复制代码代码如下:


for(i = n; i > 0; i--) 



… 





for(i = 0; i < n; i++) 



… 


为什么前者比后者快? 

我当时的解释是: 

i- -操作本身会影响CPSR(当前程序状态寄存器),CPSR常见的标志有N(结果为负), Z(结果为0),C(有进位),O(有溢出)。i > 0,可以直接通过Z标志判断出来。 

i++操作也会影响CPSR(当前程序状态寄存器),但只影响O(有溢出)标志,这对于i < n的判断没有任何帮助。所以还需要一条额外的比较指令,也就是说每个循环要多执行一条指令。 

(这是五年前tjww告诉我的,当时他在AVR上写一个LCD驱动程序,使用后者LCD会闪烁,使用前者则没有问题。) 

为了确认我的理解是正确的,做了个实验:

复制代码代码如下:


int loop_dec(int n) 



int i = 0; 

int v = 0; 



for(i = n; i > 0; i--) 

v +=i; 



return v; 





int loop_inc(int n) 



int i = 0; 

int v = 0; 



for(i = 0; i < n; i++) 

v +=i; 



return v; 


用arm-linux-gcc编译,然后反汇编: 

i--的循环条件: 

4c: e51b3014 ldr r3, [fp, #-20] 

50: e3530000 cmp r3, #0 ; 0x0 

54: cafffff5 bgt 30 <loop_dec+0x30> 



i++的循环条件: 

b8: e51b3018 ldr r3, [fp, #-24] 

bc: e1520003 cmp r2, r3 

c0: bafffff4 blt 98 <loop_inc+0x30>结果和我想象的并不一样,这是怎么回事呢?我想可能因为没有加优化选项,于是加上-O选项,结果变为: 

i--的循环条件: 

14: e2500001 subs r0, r0, #1 ; 0x1 

18: 1afffffc bne 10 <loop_dec+0x10> 



i++的循环条件: 

3c: e2833001 add r3, r3, #1 ; 0x1 

40: e1500003 cmp r0, r3 

44: 1afffffb bne 38 <loop_inc+0x14>这下没错了,果然少一个cmp指令。

文章出处:http://www.limodev.cn/blog

【C/C++开发】循环中使用递减计数与递增计数的效率区别的更多相关文章

  1. python web开发-flask中的url带斜线和不带斜线区别详解

    通过flask进行路由配置的时候,有一个细节,就是同样的url,带上"/"和不带"/"有什么区别. 举例说明: 比如有个url,名字为"/url&qu ...

  2. 每天一点点之vue框架开发 - vue-router路由在循环中携带参数

    场景:要实现一个标签云,通过循环把标签渲染,然后单击标签的时候实现跳转,跳转路由一样,通过唯一参数来实现请求不同的数据 因此,就需要在for循环中来携带参数,本节所讲的是路由使用对象的形式(别名)来实 ...

  3. 能不能在FOR循环中执行SQL?

    JDBC最基础的For循环处理SQL的方式 以及执行时间 package javaee.net.cn.jdbc; import java.sql.*; public class TestTransac ...

  4. iOS开发 Xcode8中遇到的问题及改动

      iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...

  5. UI开发学习中遇到的问题汇总

    1.给UIView设置圆角,边框,阴影绘制,需要使用layer 1)设置圆角cornerView.layer.cornerRadius = 20; //设置试图圆角的大小cornerView.laye ...

  6. java开发代码中的50个性能优化细节

    在java程序中,性能的大部分原因并不在java与语言,而是程序本身.养成好的编码习惯非常重要,能够显著地提升程序性能. 1:尽量在合适的场合使用单例 使用单利可以减轻加载的负担,缩短加载时间,提高加 ...

  7. AOP在大规模软件开发项目中的应用(图)

    AOP在大规模软件开发项目中的应用(图) 本文的写作源于一个真实的大型软件开发项目,我们努力尝试在这个项目中推广应用AOP.在此我们将对曾经面临过的一些实际问题与困难进行分析,试图引发关于面向方面软件 ...

  8. 简单的node爬虫练手,循环中的异步转同步

    简单的node爬虫练手,循环中的异步转同步 转载:https://blog.csdn.net/qq_24504525/article/details/77856989 看到网上一些基于node做的爬虫 ...

  9. Shell 循环中实现展示进度百分比的脚本方法

    Shell 循环中实现展示进度百分比的脚本方法 当我需要处理一个几万行的文件的时候,需要处理的时间是比较长的.我一开始的想法是,没处理一行,就输出一个 # 号.但是这样还是会出现很多很多的 # 号,即 ...

随机推荐

  1. mysql 查看删除触发器等操作

    mysql 查看删除触发器等操作 平时很少操作触发器,源于昨晚的一次故障,使用pt-online-change-schema修改大表过程中出现异常,再次执行时,提示已经存在触发器,导致失败. 这里推荐 ...

  2. 解决微信小程序textarea 里输入的文字或者是placeholder里的值,飘到弹出view上

    在uniapp微信小程序开发中使用textarea,结果发现输入框的问题浮动起来,view无法把他覆盖,设法设置index的值也不生效,所以只能是通过条件v-if或者v-show使其隐藏就可以了

  3. [人物存档]【AI少女】【捏脸数据】1222今日份的推荐

    AISChaF_20191030183624290.png

  4. isset和empty以及is_null区别

    2.empty,isset首先都会检查变量是否存在,然后对变量值进行检测.而is_null 和 “参数本身”只是直接检查变量值,是否为null,因此如果变量未定义就会出现错误! 3.isset():仅 ...

  5. Visio:为什么按下方向键,选中的目标不动,绘图区(页面)却在移动

    造冰箱的大熊猫,本文适用于Microsoft Visio 2007@cnblogs 2018/12/12 检查下键盘的“Scroll Lock”键是不是被激活了(键盘上对应的指示灯被点亮).Scrol ...

  6. Linux系统启动顺序

    Linux启动顺序 加电—加电自检(BIOS)—硬件检查 —MBR(找到需要启动的系统,由于实际计算机上可能会装有多个系统) —bootloader系统初始化,装载kenel到内存 —内核执行,决定哪 ...

  7. Android_(自动化)获取手机存储卡的容量

    手机上的存储卡是可以随时插拔的,每次插拔时会像操作系统总发送Action广播事件. 使用StatFs文件系统来获取MicroSD存储卡的剩余容量,在使用前先判断是否插入了存储卡,如果不存在则不于计算 ...

  8. ESPCMS的CSRF添加管理员账号

    ESPCMS的CSRF添加管理员账号 前言 这里开始的思路是先注入进去 然后getshell 但是不关CSRF什么事 换思路 看了一下群消息  大哥发了一个视频  后台名称admin  admin12 ...

  9. Linux下压缩和解压命令

    http://man.linuxde.net/tar

  10. springboot 项目部署后 404的问题

    是因为打包的时候,没有把webapp打包进去 pom.xml 在build 里加入下面的依赖即可 <!-- resources插件,在打jar包时可以将webapp目录下的文件进行打包 --&g ...