在辛昕 的帖子里看到一个问题,就是for循环的效率问题,因此自己查找了一下答案。
一.关于for(;;);和while(1);的循环效率问题。
a) 在keil C51上面,这两个没有差异,是一样的。在IAR FOR 430上,结果也是一样的。都是只有一条汇编代码。
b) 但是在其他的编译器上,未必。国外的工程师貌似更倾向于for(;;);
c) 可以参考一下这个:http://hi.baidu.com/%C4%E1%BF%A8njord/blog/item/f451dcfb1b33b7384f4aea8f.html
d) http://hi.baidu.com/chengsheng0623/blog/item/9dfa934fdfba8fd7d0c86ad0.html。注意里面提到的编译器是UV4。
二、关于for(i=0; i<8; i++) 和 for(i=8; i>0; i--)这两者的效率问题。
先上图:下面的这张是KEIL C51中的汇编代码
显然,用for(i=8; i>0; i--)的效率更高。
下面这一张是IAR FOR 430中编译的结果
红色框框中分别是for(i=8; i>0; i--); 和 for(i=0; i<8; i++);的循环体。
可以看出,两者几乎没有什么区别
所以,我个人认为,关于这两种的差别,主要还是要看指令系统。
C51中有个DJNZ,所以判断起来比较简单,代码也简单。
PS:我还刚学汇编哈,大家有什么问题就提出来,论坛应该有人回答。我未必懂…嘿嘿。
三、whille(--i); 和 while(i--); 的效率问题。
看上去感觉两个应该是一样的,即使是在51中,因为都是自减。然后汇编代码却相差甚远。
从图中可知,while(--i)的效率比while(i--)的效率高出很多,当然这仅仅是在keil C51的编译器下,其他的编译器上未必是这样的。
下面是IAR FOR 430编译的结果。
仔细观察的人可以发现,一个i=8,一个i=9,当然这个仅仅是为了使两者的循环次数都是8.
从汇编程序来看,两者的代码就是一样的,没什么差别。
不知道如何把图片放在文字中间。。。大家见谅。
对于这个问题,由于个人汇编还不怎么懂。希望懂的人出来讲解一下,嘿嘿。