昨天同事问了我一个问题,有两个循环语句:
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指令。
相关推荐
1. 循环执行效率:在编程实践中,循环是经常使用的一种结构,而循环的执行效率会对程序的性能产生重要影响。在比较递增(i++)与递减(i--)操作的效率时,重点是关注它们在循环中的性能表现。 2. 状态寄存器(CPSR)的...
上述代码虽然能完成任务,但效率较低,因为它涉及两个嵌套的循环,导致计算次数与元素数量的平方成正比。 接下来,我们用`for-each`循环来改进这个例子。MATLAB从R2008a版本开始引入了`containers.Map`类,可以配合...
- **do-while循环**:与while相似,但无论条件是否成立,至少会执行一次循环体。 - **使用goto和if构成的循环**:虽然不推荐,但在某些特殊情况下,可以使用goto跳转来实现循环。 - **多重循环**:可以嵌套多个...
- **示例**:与while循环类似,但do/while循环至少会执行一次循环体: ```csharp int result = 0; int i = 1; do { result += i; i++; } while (i ); Console.WriteLine("result=" + result); ``` - 在do...
WHILE i <= 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 ...
在实际编程中,正确的选择不仅关乎代码的执行效率,更关系到代码的可维护性和清晰度。尽管在现代JavaScript中性能差异微乎其微,但我们仍建议开发者根据具体的需求选择合适的自增运算符,以写出逻辑清晰且易于理解的...
3. `++i` 与 `i++` 的比较: 在赋值语句中,两者的主要区别在于赋值发生的时间点。`++i` 会在赋值之前增加 `i`,而 `i++` 则会在赋值之后增加 `i`。这意味着如果你将自增操作符用于赋值给另一个变量,结果会有所...
在计算机编程中,循环结构是解决重复处理问题的关键,它允许我们执行一段代码多次,直到满足特定条件为止。本文将详细讨论三种主要的循环语句:while、do-while 和 for。 首先,循环构造(Iteration Structure)是...
通过选择合适的循环结构,可以提高程序的效率和可读性。 练习题 本文档提供了9道练习题,每道题目都涉及到循环结构的不同方面,例如while循环、for循环、do-while循环等,旨在帮助读者巩固对循环结构的理解和应用...
do-while循环与while循环类似,但它的特点是先执行循环操作,然后判断循环条件。如果循环条件为真,循环继续执行;否则,循环退出。do-while循环的基本语法结构如下: ``` do { 循环操作 } while (循环条件); ``` ...
C#中的循环语句是编程语言中最基本的控制结构之一,用于重复执行某些操作。在本文中,我们将通过多个示例代码,深入探讨C#中的循环语句,特别是for循环的应用。 一、九九乘法表 在C#中,我们可以使用for循环来实现...
每次内层循环执行时,都会打印一行乘法表达式。当内层循环完成后,通过`System.out.println()`换行,以便打印下一行乘法表达式。 #### 五、嵌套循环注意事项 1. **性能考虑**:虽然嵌套循环非常有用,但过度使用...
【财务管理循环控制】是会计学中的一个重要概念,它涉及到企业运营中的资金管理、成本控制以及效益分析等关键环节。...在编程实践中,选择合适的循环结构可以优化代码的执行效率,同时确保程序的正确性。
- **定义**:与`while`循环类似,但先执行一次循环体再检查条件。 - **语法**: ```java do { // 循环体 } while (expression); ``` - **特点**: - 至少会执行一次循环体,即使初始时`expression`为假。 - ...
`do...while`循环与`while`循环类似,但至少会执行一次循环体,然后再检查条件是否为真。其语法如下: ```java do { // 循环体 } while (条件表达式); ``` #### 示例1:基本用法 ```java do { System.out....
这不仅增加了内存开销,还降低了执行效率。为了提高性能,可以使用 `StringBuilder` 或 `StringBuffer` 进行字符串拼接。 - **原方式**: ```java String str = ""; for (int i = 0; i >= 18000; i--) { str +=...
- do-while循环是一种“直到型”循环,与while循环不同的是,它会先执行一次循环体,然后再检查条件。即使在初始条件不满足时,do-while循环也会至少执行一次循环体。例如,同样打印1到10的整数,使用do-while循环...
在JavaScript和Java编程中,提高代码执行效率是开发者必须关注的重要方面,特别是在处理大量数据时。本文主要讨论了如何优化JavaScript和Java中的for循环,以提高编程效率。 首先,我们来回顾一下传统的for循环语法...
- **变量实例化**:将循环次数较少的变量放在外层可以显著减少变量的实例化次数,从而提高程序的执行效率。 - **循环顺序**:将循环次数较大的变量置于内层循环,可以减少内部循环的执行次数,进而提高程序性能。 - ...
* 统计表 A、B 的总行数:可以使用 Kettle 设置循环变量来实现循环执行这些表的数据抽取操作。 * 数据抽取和加载:Kettle 设置循环变量可以实现数据抽取和加载的自动化,提高数据处理效率和灵活性。 Kettle 设置...