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

 更新时间:2011年01月05日 23:44:05   作者:  
i++循环与i-–循环的执行效率(递增与递减效率),需要的朋友可以参考下。
昨天同事问了我一个问题,有两个循环语句:
复制代码 代码如下:

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

相关文章

  • 小项目中管理npm包版本的思路与方法

    小项目中管理npm包版本的思路与方法

    这篇文章主要给大家介绍了关于小项目中该如何管理npm包版本的思路与方法,npm包版本管理是非常重要的,文章通过示例代码介绍的很详细,需要的朋友可以参考下
    2021-06-06
  • 如何使用VSCode插件Remote-Tunnels连接服务器

    如何使用VSCode插件Remote-Tunnels连接服务器

    本文介绍使用Remote - Tunnels连接服务器,该方法需要远程服务器有流畅的网络环境,它使用微软的服务来建立隧道,需要登录GitHub,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • 风中叶老师讲述的学习方法(学习编程的朋友需要看)

    风中叶老师讲述的学习方法(学习编程的朋友需要看)

    风中叶老师讲述的学习方法(学习编程的朋友需要看),希望大家能按照说明的那样,自己多动手动脑
    2008-10-10
  • vs2019生成dll并调用的实现示例

    vs2019生成dll并调用的实现示例

    这篇文章主要介绍了vs2019生成dll并调用的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • kali添加开机自启的方法

    kali添加开机自启的方法

    采用systemd的方法,kali默认是没有rc.local的,需要自己创建。本方法也适用于ubuntu 18.04 64bit,对kali添加开机自启知识感兴趣的朋友一起看看吧
    2022-09-09
  • 在ubuntu18.04版本安装vscode(2种)

    在ubuntu18.04版本安装vscode(2种)

    这篇文章主要介绍了在ubuntu18.04版本安装vscode,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • HTTP Referer详解及Referer控制

    HTTP Referer详解及Referer控制

    HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的
    2018-04-04
  • Visual Studio安装git插件的方法步骤

    Visual Studio安装git插件的方法步骤

    这篇文章主要介绍了Visual Studio安装git插件的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 提高编程技能的11个建议

    提高编程技能的11个建议

    当你不熟悉编程的时候,你可能会觉得无从下手,并且不知道如何运用学到的知识。只要你通过了这一困难的学习阶段,你就会发现一个全新的世界
    2014-08-08
  • tcp、udp、ip协议分析_动力节点Java学院整理

    tcp、udp、ip协议分析_动力节点Java学院整理

    这篇文章主要为大家详细介绍了tcp、udp、ip协议分析的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07

最新评论