`
yangtao309
  • 浏览: 64734 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

i++循环与i--循环的执行效率

阅读更多
转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>

昨天同事问了我一个问题,有两个循环语句:

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

i++的循环条件:
  b8:   e51b3018        ldr     r3, [fp, #-24]
  bc:   e1520003        cmp     r2, r3
  c0:   bafffff4        blt     98
结果和我想象的并不一样,这是怎么回事呢?我想可能因为没有加优化选项,于是加上-O选项,结果变为:

i--的循环条件:
  14:   e2500001        subs    r0, r0, #1      ; 0x1
  18:   1afffffc        bne     10

i++的循环条件:
  3c:   e2833001        add     r3, r3, #1      ; 0x1
  40:   e1500003        cmp     r0, r3
  44:   1afffffb        bne     38
这下没错了,果然少一个cmp指令。

分享到:
评论

相关推荐

    i++循环与i-–循环的执行效率(递增与递减效率)

    i++循环与i-–循环的执行效率(递增与递减效率),需要的朋友可以参考下。

    Python基础教程:列表推导式对比For循环执行效率.pdf

    Python基础教程:列表推导式对⽐For循环执⾏效率 如果把1-10以内的元素追加到⼀个新的列表表中,如果使⽤for循环我们可以这么做: a = [] for i in range(1,11): a.append(i) print(a) 输出结果如下: 如果我们换成...

    计算机系统结构课后习题3

    由于循环引入的相关:s1与s3’(输出相关,反相关)、s4与s4’(真相关)、s4与s3’(真相关)、s4与s1’(真相关)、s2与s3’(反相关) 比如当i=2和3时,循环展开如下所示: a[2]=b[2]+a[2]; /*s1*/ c[3]=a[2]+d[2];...

    C 程序指导书及实践指导

    察对换后的外循环与内循环控制表达式执行的总次数有无变化? (4)将(3)中程序写为 main() { int i,j,k; long sum=0; for (j=1.j&lt;=3.j++) { k=j+2; for(i=1;i;i++) sum=sum+(i+1)*(i+1)**k; } printf(“sum is :...

    C语言程序设计标准教程

    (2) 循环执行语句  do while语句,while语句,for语句 (3) 转向语句  break语句,goto语句,continue语句,return语句 4.复合语句 把多个语句用括号{}括起来组成的一个语句称复合语句。 在程序中应把复合语句...

    javascript for循环从入门到偏门(效率优化+奇特用法)

    一,for循环的基本写法 代码如下: 代码如下: //例一for(var i=1;i&lt;=10;i++) { alert&#40;i&#41;; } 这段代码太简单了,我都不好意思拿出手。代码的执行结果是依次弹出1到10,PS:在早期的IE如IE6中,你把10改成...

    并行计算课程设计(代码+执行文件+文档)

    利用了OpenMP里面的#omp parallel sections将对两个for循环用两个线程并行化执行,以多线程方式并行运行程序,并行的算法步骤如下: (1)初始化_max = 10000000; (2)创建两个线程; (3)由OpenMP编译指导...

    最新JAVA编程题全集_50题及答案

    List&lt;String&gt; temp = list(new StringBuilder(base).deleteCharAt(i).toString(),buff+base.charAt(i)); result.addAll(temp); } return result; } } ++++++++++++++++++++++++++++++++++++++++++++++++...

    php基于CI+layui开发的个人博客系统.zip

    这种特性使得开发者能够轻松地在静态网页中插入动态内容,实现数据渲染、条件判断、循环处理等功能,极大地简化了Web开发流程。同时,PHP也支持纯脚本文件编写,适用于构建复杂的后台逻辑。 PHP语法简洁明了,借鉴...

    精髓Oralcle讲课笔记

    --与66题的写法是一样的,但是不推荐使用using : 假设条件太多 --------------------------------------/非等值连接------------------------------------------/ 68、select ename,grade from emp e join ...

    并行计算课程设计(报告+代码+可执行文件)

    利用了OpenMP里面的#omp parallel sections将对两个for循环用两个线程并行化执行,以多线程方式并行运行程序,并行的算法步骤如下: (1)初始化_max = 10000000; (2)创建两个线程; (3)由OpenMP编译指导...

    达内 coreJava 习题答案

    i++){ //运行老久,减少循环次数会快很多,只是精确度小些 pi += (fenZi/fenMu) ; fenZi *= -1.0; //每项分子的变化是+4,-4,+4,-4 .... fenMu += 2.0; //分母的变化是1,3,5,7, .... 每项递加2 } ...

    leetcode添加元素使和等于-Programming-tips:这几个编程小技巧,让你代码效率提高一个档次

    第二种方法用一个额外变量len避免了每次条件判断都要重复执行函数strlen(s),而执行该函数是非常耗时的(假设字符串的长度为n,函数执行的复杂度为O(n)),尤其是当for循环体的语句比较少,字符串比较长的时候。...

    操作系统精髓与设计原理答案

    b. 描述通过使用IEN,如何提高执行效率? 答案:a.来源于打字机的输入储存在INPR中。只有当FGI=0时,INPR才会接收来自打字机的数据。当数据接收后,被储存在INPR里面,同时FGI置为1。CPU定期检查FGI。如果FGI=1,...

    Javascript-For-Loop-Optimization:Javascript FOR循环优化

    可以对程序进行优化,使其尺寸更小,消耗更少的内存,更快地执行或执行更少的输入/输出操作(来自Google)。 因此,尝试优化Javascript FOR循环,进行一些实验。 先决条件 Create the nums array with some random ...

    语言程序设计课后习题答案

    类通过一个简单的外部接口,与外界发生关系,对象与对象之间通过消息进行通讯。这样,程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。通过实现继承与多态性,还可以大大提高程序的可...

    软件工程之专题十:算法分析与设计

     效率与存储量需求:效率指的是算法执行的时间;存储量需求指算法执行过程中所需要的最大存储空间。一般这两者与问题的规模有关。 1.1 迭代法: 迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程...

    javascript for循环性能测试示例

    for循环,如何使用效率更高,下面举例来说明: // 先定义一个测试数组 var arr = [0,1,2,3,4,5,6,7,8,9]; // 执行测试 test1(); test2(); test3(); function test1(){ console.time('test1'); for(var i = 0; i &...

Global site tag (gtag.js) - Google Analytics