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条回答
fengyiyu1006
1楼-- · 2020-01-20 14:08
IAR 51 比 keil 51 差远了。

我对比了IAR 51、 keil 51、 SDCC 51 的数学函数的编译结果。

代码很简单,如下:
//-----------------------------------------------------------------------------
#include<math.h>

//-----------------------------------------------------------------------------
#if defined SDCC        /* for SDCC */

#define DATA  __data

__sfr   __at(0x80)  P0;
__sfr   __at(0x90)  P1;
__sfr   __at(0x99)  SBUF0;

#elif defined __C51__        /* for keil C51 */

#define DATA  data

sfr   P0 = 0x80;
sfr   P1 = 0x90;
sfr   SBUF0 = 0x99;

#elif defined __ICC8051__        /* for iar 8051 */

#define DATA __data

__sfr __no_init volatile unsigned char P0 @ 0x80;
__sfr __no_init volatile unsigned char P1 @ 0x90;
__sfr __no_init volatile unsigned char SBUF0 @ 0x99;

#endif

//-----------------------------------------------------------------------------
DATA float var1 = 10.23;
DATA float var2 = 2.56;
DATA float var3 = 1.234;
//-----------------------------------------------------------------------------
void main( void )
{
  P0 = (unsigned char)(var1 * var2);
  P1 = (unsigned char)(var1 / var2);

#if defined SDCC        /* for SDCC */
  SBUF0 = (unsigned char)(expf(var3));
#elif defined __C51__        /* for keil C51 */
  SBUF0 = (unsigned char)(exp(var3));
#elif defined __ICC8051__        /* for iar 8051 */
  SBUF0 = (unsigned char)(exp(var3));
#endif

  while(1);
}

编译结果差很远:

SDCC3.0 + Silicon Laboratories IDE4.20

sdcc.exe -c --opt-code-size --no-xinit-opt --iram-size 256 --xram-size 512 --code-size 0x1DFE --debug --use-stdout -V main.c
sdcc.exe --opt-code-size --no-xinit-opt --iram-size 256 --xram-size 512 --code-size 0x1DFE --debug --use-stdout -V main.rel

   flash size: 1568 bytes
data ram size: 33 bytes

//////////////////////////////////////////////////////////////////////////////////////////////////

IAR7.50A

3 052 bytes of CODE  memory
   65 bytes of DATA  memory (+ 3 absolute )

//////////////////////////////////////////////////////////////////////////////////////////////////

Keil C51 V8.18

   flash size: 1366 bytes
data ram size: 21 bytes

//////////////////////////////////////////////////////////////////////////////////////////////////

附上工程:IAR、KEIL、SDCC 51的编译效率比较ourdev_696038LUX52N.rar(文件大小:51K) (原文件名:compare.rar)
lhbzqh
2楼-- · 2020-01-20 16:38
唉,作为刚入职不久的人来说,代码的效率简直就是天方夜谭啊,学习学习了
766465864
3楼-- · 2020-01-20 21:48
 精彩回答 2  元偷偷看……
KongQuan
4楼-- · 2020-01-20 22:56
这里的讨论,确实是很精彩,我刚好遇到一个公司同事用IAR写的复杂工程,而我习惯用Keil,要转到IAR,新建一个工程好多麻烦事,到现在也没弄出可用的hex来.
可以说,从容易上手这一点来说,keil占优势,呵呵,当初我学用keil的时候几乎没有遇到困难
xiaobenyi
5楼-- · 2020-01-21 03:43
是不是keil 对数学函数的编译效率比IAR要高?
xunke
6楼-- · 2020-01-21 05:37
没用过IAR的飘过,不过应该还是习惯问题,见仁见智吧

一周热门 更多>