|
计数循环是程序中十分常用的流程控制结构。在C与验证宏,常用下面累加计数的循环形式:
for(loop=1,loop<=limit;loop++)
而这种累加计数的方法符合一般的自然思维习惯,所以下面这种递减方法很少使用:
for(loop=limit;loop!=0;loop--)
这两种循环形式在逻辑上并没有效率差异,但是映射到具体的体系结构中时,就产生了大大是不同,如图所示。
int fact1 (int limit) int fact1 (int limit)
{ {
... …
for (i=1;i<=limit;i++) for (i=limit;i!=0;i--)
( {
fact=fact*i; fact=fact*i;
) }
... …
} }
Fact1 Fact2
... ... … …
0x000010: MUL R2,R1,R2 0x000010: MUL R0,R1,R0
0x000014: ADD R1,R1,#1 0x000014: SUBS R1,R1,#1
0x000018: CMP R2,R0 0x
0x
... ...
0x000024: MOV PC,LR
从图中可以发现,累加法比递减法多用了1条指令,当循环次数比较大时,这2段代码就会在性能上产生明显的差异。其本质原因是:当进行一个非0常数比较时,必须用专门的CMP指令进行判别。因此,在ARM的体系结构下编程,建议采用递减至0的方法来设置循环条件。
凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网