昨天同事问了我一个问题,有两个循环语句:
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-–循环的执行效率(递增与递减效率),需要的朋友可以参考下。
Python基础教程:列表推导式对⽐For循环执⾏效率 如果把1-10以内的元素追加到⼀个新的列表表中,如果使⽤for循环我们可以这么做: a = [] for i in range(1,11): a.append(i) print(a) 输出结果如下: 如果我们换成...
由于循环引入的相关: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];...
察对换后的外循环与内循环控制表达式执行的总次数有无变化? (4)将(3)中程序写为 main() { int i,j,k; long sum=0; for (j=1.j<=3.j++) { k=j+2; for(i=1;i;i++) sum=sum+(i+1)*(i+1)**k; } printf(“sum is :...
(2) 循环执行语句 do while语句,while语句,for语句 (3) 转向语句 break语句,goto语句,continue语句,return语句 4.复合语句 把多个语句用括号{}括起来组成的一个语句称复合语句。 在程序中应把复合语句...
一,for循环的基本写法 代码如下: 代码如下: //例一for(var i=1;i<=10;i++) { alert(i); } 这段代码太简单了,我都不好意思拿出手。代码的执行结果是依次弹出1到10,PS:在早期的IE如IE6中,你把10改成...
利用了OpenMP里面的#omp parallel sections将对两个for循环用两个线程并行化执行,以多线程方式并行运行程序,并行的算法步骤如下: (1)初始化_max = 10000000; (2)创建两个线程; (3)由OpenMP编译指导...
List<String> temp = list(new StringBuilder(base).deleteCharAt(i).toString(),buff+base.charAt(i)); result.addAll(temp); } return result; } } ++++++++++++++++++++++++++++++++++++++++++++++++...
这种特性使得开发者能够轻松地在静态网页中插入动态内容,实现数据渲染、条件判断、循环处理等功能,极大地简化了Web开发流程。同时,PHP也支持纯脚本文件编写,适用于构建复杂的后台逻辑。 PHP语法简洁明了,借鉴...
--与66题的写法是一样的,但是不推荐使用using : 假设条件太多 --------------------------------------/非等值连接------------------------------------------/ 68、select ename,grade from emp e join ...
利用了OpenMP里面的#omp parallel sections将对两个for循环用两个线程并行化执行,以多线程方式并行运行程序,并行的算法步骤如下: (1)初始化_max = 10000000; (2)创建两个线程; (3)由OpenMP编译指导...
i++){ //运行老久,减少循环次数会快很多,只是精确度小些 pi += (fenZi/fenMu) ; fenZi *= -1.0; //每项分子的变化是+4,-4,+4,-4 .... fenMu += 2.0; //分母的变化是1,3,5,7, .... 每项递加2 } ...
第二种方法用一个额外变量len避免了每次条件判断都要重复执行函数strlen(s),而执行该函数是非常耗时的(假设字符串的长度为n,函数执行的复杂度为O(n)),尤其是当for循环体的语句比较少,字符串比较长的时候。...
b. 描述通过使用IEN,如何提高执行效率? 答案:a.来源于打字机的输入储存在INPR中。只有当FGI=0时,INPR才会接收来自打字机的数据。当数据接收后,被储存在INPR里面,同时FGI置为1。CPU定期检查FGI。如果FGI=1,...
可以对程序进行优化,使其尺寸更小,消耗更少的内存,更快地执行或执行更少的输入/输出操作(来自Google)。 因此,尝试优化Javascript FOR循环,进行一些实验。 先决条件 Create the nums array with some random ...
类通过一个简单的外部接口,与外界发生关系,对象与对象之间通过消息进行通讯。这样,程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。通过实现继承与多态性,还可以大大提高程序的可...
效率与存储量需求:效率指的是算法执行的时间;存储量需求指算法执行过程中所需要的最大存储空间。一般这两者与问题的规模有关。 1.1 迭代法: 迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程...
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 &...