Keil C51与IAR 8051的编译效率比较!

2020-01-15 19:21发布

一直听说IAR编译效率很高,今天就用Keil和IAR同时编译了dhrystones测试程序测试了一下效率~
这里使用的C51和IAR C/C++ Compiler for 8051都是目前(2010.11)我能找到的最新版。
关于Dhrystone测试的简短介绍可见http://baike.baidu.com/view/1885614.htm

Keil uVision V4.10, C51 Compiler V9.02
使用9级代码体积优化
Program Size: data=15.1 xdata=5523 code=5179
182 dhrystones/second
使用9级代码速度优化
Program Size: data=15.1 xdata=5523 code=5313
189 dhrystones/second
使用8级代码速度优化
Program Size: data=15.1 xdata=5523 const=0 code=5597
198 dhrystones/second
使用8级代码速度优化,LX51链接
Program Size: data=15.1 xdata=5523 const=0 code=5594
198 dhrystones/second
使用11级代码速度优化,LX51链接
Program Size: data=15.1 xdata=5523 const=0 code=5594
198 dhrystones/second


Keil C51编译效率测试


IAR Embedded Workbench, IAR C/C++ Compiler for 8051 7.60.1 (7.60.1.40026)
代码体积优化(最高)
4 962 bytes of CODE memory
25 bytes of DATA memory (+ 7 absolute )
5 704 bytes of XDATA memory
64 bytes of IDATA memory
8 bits  of BIT memory
211 dhrystones/second

代码速度优化(最高)
4 733 bytes of CODE memory
25 bytes of DATA memory (+ 7 absolute )
5 704 bytes of XDATA memory
64 bytes of IDATA memory
8 bits  of BIT memory
255 dhrystones/second

IAR C/C++ Compiler for 8051编译效率测试


为了保证测试的公平性,在测试时使用了统一的第三方仿真软件Raisonance 8051 Simulator来仿真。先用keil和IAR编译出hex文件,然后一起放到Simulator里去仿真。仿真时使用AT89S51,12MHz晶振。
IAR在编译时printf库大小选择为medium。

看来在该测试中IAR的代码优化确实做得很恐怖的,无论是代码大小和速度都要比keil C51更胜一筹~
更神奇的是在这个测试中代码速度优化生成的代码比体积优化还小!仔细检查了输出的raw-binary格式文件,确实是速度优化时更小!

在使用Keil的实验中发现,在本测试程序中,8级优化和11级优化,使用BL51或LX51,在速度上都没有区别。使用lx51做链接器的优点就是能省3个字节
另外,在本测试程序中,无论开启还是关闭全局寄存器着 {MOD}对代码速度和性能都没有影响
使用9级优化(Common Block Subroutines)会减慢程序运行的速度(189 dhrystones/second),甚至比8级优化时还慢。不过可以缩小些代码体积,这点经验大家可以借鉴下。

顺便附上个IAR EW8051 V7.60 完全光盘Full正式版下载链接(感谢formula555):
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4131100&bbs_page_no=1&bbs_id=9999
测试程序见附件,大家也可以自己试一下。

点击此处下载 ourdev_601488JZZ3L4.rar(文件大小:192K) (原文件名:dhrystone.rar)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
57条回答
victzhang
1楼-- · 2020-01-16 19:44
回复【5楼】takashiki  岚月影
-----------------------------------------------------------------------
使用LX51的测试已经加上了。LX51和全局变量着 {MOD}几乎没太大作用。

对于Dhrystone测试的批评确实很多,因此该测试结果只能做参考。但这至少是一个较大的工程,比较还是有一定意义的,至少要比闪个LED比较有价值得多。
在我手头还有些较大的完整Keil和IAR项目,很想用两个编译器都试一下作个比较。但由于Keil和IAR差异较大,不太好移植,所以也没有试过。如果谁能把一个实际的大型工程移植到两个编译器中试一下,测试结果会更有意义。

其实对于已有的Keil工程代码,也没必要移植到IAR上,太麻烦了,一般项目也不会对代码大小和效率有那么高要求。Keil和IAR我都用过一段时间,感觉编译器区别还是不小的。至于用哪个编译器和IDE,可根据自己的喜好而定。我看过keil和iar生成的汇编代码,各有各的优缺点,差距不是特别大。

因此,8051上,如果已经在用keil了不妨继续用,新项目里有条件的话不妨试试IAR。用过后可根据个人喜好选择用哪一个。
haigerl
2楼-- · 2020-01-17 00:10
mark
STM8L103
3楼-- · 2020-01-17 04:00
难道 新版本IAR 8051优化有质的提升??

貌似通常情况下,iar8051优化要逊于KEIL C51才是。
june4th
4楼-- · 2020-01-17 08:14
 精彩回答 2  元偷偷看……
STM8L103
5楼-- · 2020-01-17 10:14
KEIL与IAR移植是有点麻烦。

最主要是指针,KEIL 的指针如果没有存储修饰符,则是通用指针。
IAR指针没有没有存储修饰符,是指向RAM的的指针,通用指针则要加上__generic关键字。

还有就是const处理不一样。
keil 的常量地址没有const属性,可以任意传递。
而IAR常量地址是一个const指针,不能传递给非const指针。

还有位变量问题。KEIL用bit,而iar则用_Bool。

函数重入上,KEIL与IAR也不一样。
IAR还是用了虚拟寄存器。


个人对IAR8051更熟悉一些。
总的来说,IAR更符合标准C一些,而且还支持大部分C99标准语法,
不过IAR8051的效率并不高,应该要比KEIL差。
s3c2440
6楼-- · 2020-01-17 13:06
学习一下,我还是初学

一周热门 更多>