`

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-–循环的执行效率(递增与递减效率)

    1. 循环执行效率:在编程实践中,循环是经常使用的一种结构,而循环的执行效率会对程序的性能产生重要影响。在比较递增(i++)与递减(i--)操作的效率时,重点是关注它们在循环中的性能表现。 2. 状态寄存器(CPSR)的...

    MATLAB工具箱大全-将多重循环转为单重循环-For-Each

    上述代码虽然能完成任务,但效率较低,因为它涉及两个嵌套的循环,导致计算次数与元素数量的平方成正比。 接下来,我们用`for-each`循环来改进这个例子。MATLAB从R2008a版本开始引入了`containers.Map`类,可以配合...

    c语言循环课件 讲述循环

    - **do-while循环**:与while相似,但无论条件是否成立,至少会执行一次循环体。 - **使用goto和if构成的循环**:虽然不推荐,但在某些特殊情况下,可以使用goto跳转来实现循环。 - **多重循环**:可以嵌套多个...

    C#应用程序开发-循环结构语句.pptx

    - **示例**:与while循环类似,但do/while循环至少会执行一次循环体: ```csharp int result = 0; int i = 1; do { result += i; i++; } while (i ); Console.WriteLine("result=" + result); ``` - 在do...

    一个简单的sql循环语句脚本

    WHILE i &lt;= 10 LOOP -- 当i小于等于10时执行循环体 DBMS_OUTPUT.PUT_LINE(i); -- 输出i的值 i := i + 1; -- 每次循环后,i自增1 END LOOP; END; ``` 三、FOR循环 1. PL/SQL中的FOR IN循环: ```sql FOR i IN ...

    JS for循环中i++ 和 ++i的区别介绍

    在实际编程中,正确的选择不仅关乎代码的执行效率,更关系到代码的可维护性和清晰度。尽管在现代JavaScript中性能差异微乎其微,但我们仍建议开发者根据具体的需求选择合适的自增运算符,以写出逻辑清晰且易于理解的...

    php中++i 与 i++ 的区别

    3. `++i` 与 `i++` 的比较: 在赋值语句中,两者的主要区别在于赋值发生的时间点。`++i` 会在赋值之前增加 `i`,而 `i++` 则会在赋值之后增加 `i`。这意味着如果你将自增操作符用于赋值给另一个变量,结果会有所...

    循环结构程序设计:三种循环语句.doc

    在计算机编程中,循环结构是解决重复处理问题的关键,它允许我们执行一段代码多次,直到满足特定条件为止。本文将详细讨论三种主要的循环语句:while、do-while 和 for。 首先,循环构造(Iteration Structure)是...

    C语言循环结构练习题带答案.docx

    通过选择合适的循环结构,可以提高程序的效率和可读性。 练习题 本文档提供了9道练习题,每道题目都涉及到循环结构的不同方面,例如while循环、for循环、do-while循环等,旨在帮助读者巩固对循环结构的理解和应用...

    java循环结构学习教案.pptx

    do-while循环与while循环类似,但它的特点是先执行循环操作,然后判断循环条件。如果循环条件为真,循环继续执行;否则,循环退出。do-while循环的基本语法结构如下: ``` do { 循环操作 } while (循环条件); ``` ...

    C#循环案例

    C#中的循环语句是编程语言中最基本的控制结构之一,用于重复执行某些操作。在本文中,我们将通过多个示例代码,深入探讨C#中的循环语句,特别是for循环的应用。 一、九九乘法表 在C#中,我们可以使用for循环来实现...

    Java中的嵌套循环教程

    每次内层循环执行时,都会打印一行乘法表达式。当内层循环完成后,通过`System.out.println()`换行,以便打印下一行乘法表达式。 #### 五、嵌套循环注意事项 1. **性能考虑**:虽然嵌套循环非常有用,但过度使用...

    财务管理循环控制PPT学习教案.pptx

    【财务管理循环控制】是会计学中的一个重要概念,它涉及到企业运营中的资金管理、成本控制以及效益分析等关键环节。...在编程实践中,选择合适的循环结构可以优化代码的执行效率,同时确保程序的正确性。

    Java软件开发实战 Java基础与案例开发详解 3-7 循环语句 共11页.pdf

    - **定义**:与`while`循环类似,但先执行一次循环体再检查条件。 - **语法**: ```java do { // 循环体 } while (expression); ``` - **特点**: - 至少会执行一次循环体,即使初始时`expression`为假。 - ...

    while do...while for循环

    `do...while`循环与`while`循环类似,但至少会执行一次循环体,然后再检查条件是否为真。其语法如下: ```java do { // 循环体 } while (条件表达式); ``` #### 示例1:基本用法 ```java do { System.out....

    Java代码循环的优化

    这不仅增加了内存开销,还降低了执行效率。为了提高性能,可以使用 `StringBuilder` 或 `StringBuffer` 进行字符串拼接。 - **原方式**: ```java String str = ""; for (int i = 0; i &gt;= 18000; i--) { str +=...

    循环程序设计PPT学习教案.pptx

    - do-while循环是一种“直到型”循环,与while循环不同的是,它会先执行一次循环体,然后再检查条件。即使在初始条件不满足时,do-while循环也会至少执行一次循环体。例如,同样打印1到10的整数,使用do-while循环...

    js,java提高编程效率之【for循环优化】.pdf

    在JavaScript和Java编程中,提高代码执行效率是开发者必须关注的重要方面,特别是在处理大量数据时。本文主要讨论了如何优化JavaScript和Java中的for循环,以提高编程效率。 首先,我们来回顾一下传统的for循环语法...

    多重For循环 优化

    - **变量实例化**:将循环次数较少的变量放在外层可以显著减少变量的实例化次数,从而提高程序的执行效率。 - **循环顺序**:将循环次数较大的变量置于内层循环,可以减少内部循环的执行次数,进而提高程序性能。 - ...

    kettle设置循环变量

    * 统计表 A、B 的总行数:可以使用 Kettle 设置循环变量来实现循环执行这些表的数据抽取操作。 * 数据抽取和加载:Kettle 设置循环变量可以实现数据抽取和加载的自动化,提高数据处理效率和灵活性。 Kettle 设置...

Global site tag (gtag.js) - Google Analytics