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

时间:2023-05-28 03:07:40 

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


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

标签:递增,递减
0
投稿

猜你喜欢

  • Python的Django框架中使用SQLAlchemy操作数据库的教程

    2021-10-28 11:41:09
  • python 多态 协议 鸭子类型详解

    2023-10-03 11:53:00
  • SqlServer 按时间段查询问题

    2024-01-19 02:15:35
  • python字典key不能是可以是啥类型

    2022-12-28 20:54:04
  • 用Python绘制一个仿黑洞图像

    2021-10-03 03:07:57
  • Python全角与半角之间相互转换的方法总结

    2023-12-25 03:50:50
  • python自动登录12306并自动点击验证码完成登录的实现源代码

    2021-07-08 12:50:29
  • python-opencv颜色提取分割方法

    2022-01-22 06:26:23
  • 用 SQL 脚本将 Access 导入 MSSQL 2000/2005 方法

    2008-10-22 13:51:00
  • 基于Python写一个番茄钟小工具

    2023-05-02 07:53:37
  • python基础教程之循环介绍

    2021-04-22 04:38:21
  • 使用ewebeditor可能会重复提交数据两次的解决办法

    2009-01-09 12:41:00
  • 网站设计做好超级链接的重要性

    2007-09-14 11:19:00
  • 除Console.log()外更多的Javascript调试命令

    2023-08-12 23:31:17
  • Python命令行click参数用法解析

    2023-07-30 14:01:20
  • Python绑定方法与非绑定方法详解

    2021-04-12 00:20:19
  • laravel 5异常错误:FatalErrorException in Handler.php line 38的解决

    2024-06-05 09:22:11
  • python如何实现MK突变检验方法,代码复制修改可用

    2022-04-10 13:31:18
  • 利用Python如何生成便签图片详解

    2021-01-02 18:09:52
  • Python内置函数Type()函数一个有趣的用法

    2023-01-16 06:30:44
  • asp之家 网络编程 m.aspxhome.com