ATFATFATF 发表于 2009-11-13 11:53:17

TKSTUDIO中GCC与ICC编译效率询问(有图有真相)

原来看过关于TKSUDIO的介绍,有些网友还是支持国人自己开发编译环境的,我抱着尝试的心态,试用了TK,第一的感觉就是界面很漂亮,那时候还在用五一,编译链用的是KEIL,仿真器也是学校买的周立功的。TK给我最深的映像就是用它来写代码很方便,智能感知和记录功能在编写大程序的时候很有用......
后来用AVR啦,由于AVR仿真器不能zhijie直接在TK里面使用,而且当时买开发板的时候卖家推荐使用ICC,我刚开始就是用ICC来的,一直用着很顺。一般做工程的时候就是用TK来编写代码,然后用ICC链接编译,再用AVR STUDIO仿真什么的。。。同时用到三个软件。
有一段时间,曾经用过TK带的编译链开发工程,全部在TK下面完成编写代码,链接编译工作,用AVT STUDIO仿真,后来发现TK的编译不是那么好用,经常会有编译没错,但是运行就有错,也有怀疑过自己程序有问题,后来编写了一些简单程序,同时用ICC和TK里面的GCC编译,运行起来确实有差别(工程配置CPU选择绝对没有问题)。
今天有时间,上周立功网站,看了TK又出了新版本,下载下来,装上,顺带也有时间,每次用ICC+TK+AVR STUDIO确实有点麻烦,想既然TK更新了,是不是再试试。抱着试一试的心态,我分别用ICC,TK建了连个工程,添加了一个一摸一样的源文件,没有用到什么都特殊的编译器自带函数,除了头文件引用不同,其他东西都相同的。工程目的是完成一个16*80点整LED的驱动,建好之后,分别编译,链接,产生代码。这次两个编译器都没有报错。
接下来是试验啦,我将TK编译的代码烧入系统,正常运行,然后将ICC的也烧入,一样正常,但是显示速度快了很多!我感觉是TK工程配置里面时钟设置问题,修改了之后,实验结果一样。原来就听说GCC的效率不高,是不是这个原因呢,继续试验。用AVR STUDIO分别打开GCC的.elf仿真文件和ICC得.cof文件,在程序同一个地方设置断点,运行,观察结果,结果令我很吃惊!同一段程序,ICC编译出来代码运行一遍用6827个周期,而TK里面的GCC编译出来的居然达到接近20000个周期,差了接近三倍!而且该程序不长,主要是循环多(附上代码,大家可以参考!)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_502799.jpg
ICC编译出来的cof文件软仿结果 (原文件名:ICC.jpg)

http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_502800.jpg
GCC编译出来的elf文件软仿结果 (原文件名:GCC.jpg)
大家可以清晰看到二者的巨大差距!我不明白的地方是,这么大的差距,是ICC编译链和GCC编译链本身的差别导致的还是TK STUDIO不完善导致的呢?我没有用过WIN AVR,用的同志可以用我的代码试验一下,我们一起探讨这个问题。说句实在话,TK STUDIO在界面风格上还是很吸引人的,脱离的编译器界面单一无味这一长期以来的现象,加入了很多人性化优点,大大提高了代码编写效率,要是我们能共同发现问题,反馈给周立功,最终收益的也将是我们。
以上是我个人的浅薄的见解,希望大家共同探讨,高手指点!
下面是程序代码(程序是有问题的,只供参考试验使用):
//数码管显示程序
#define uchar unsigned char
#define uint unsigned int
#include <avr/io.h>
//ch595的数据输入
#define clk5
#define rclk 4
#define dat6


//延时函数
void s_ms(unsigned int t)
{
    for (;t>1;t--)
    {
    }
}
//写74hc4094函数
void sendbyte(uchar byte)
{
    uchar i,tem;
    for (i=0;i<8;i++)
    {
      PORTD&=~(1<<rclk);
      PORTD&=~(1<<clk);
      tem=(byte&0x80);
      if (tem==0)
      {
            PORTD|=(1<<dat);
      }
      else
      {
            PORTD&=~(1<<dat);
      }
      byte=byte<<1;
      PORTD|=(1<<clk);
    }
}


    const unsigned char d[]=
    {
      

//同横排
      0x00,0x04,0x7F,0xFE,0x40,0x04,0x40,0x24,
      0x5F,0xF4,0x40,0x04,0x40,0x24,0x4F,0xF4,
      0x48,0x24,0x48,0x24,0x48,0x24,0x48,0x24,
      0x4F,0xE4,0x48,0x24,0x40,0x14,0x40,0x08,
//舟横排
      0x02,0x00,0x04,0x10,0x1F,0xF8,0x10,0x10,
      0x12,0x10,0x11,0x10,0x11,0x14,0xFF,0xFE,
      0x10,0x10,0x12,0x10,0x11,0x10,0x11,0x10,
      0x10,0x10,0x20,0x10,0x40,0x50,0x00,0x20,
//电横排
      0x02,0x00,0x02,0x00,0x02,0x10,0x7F,0xF8,
      0x42,0x10,0x42,0x10,0x7F,0xF0,0x42,0x10,
      0x42,0x10,0x7F,0xF0,0x42,0x10,0x02,0x00,
      0x02,0x04,0x02,0x04,0x01,0xFC,0x00,0x00,
//子横排
      0x00,0x00,0x3F,0xF0,0x00,0x10,0x00,0x20,
      0x00,0x40,0x01,0x80,0x01,0x04,0xFF,0xFE,
      0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
      0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,
//学横排
      0x22,0x08,0x11,0x08,0x11,0x10,0x00,0x20,
      0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,
      0x00,0x40,0x01,0x84,0xFF,0xFE,0x01,0x00,
      0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,

    };
               
//主函数
main()
{
    uint c=0;
        uchar a=0,b=0,j=0,k=0,c0=0,c1=0, m=0,n=0,i=0,f=0;
    DDRD=0xff;      //初始化端口A
    PORTD=0xff;
    n=0;i=0;b=0;
      for (n=0;n<=74;n++)
      {
            if (n>4)b=n-5;
            else b=0;
            for (m=200;m>0;m--)
            {
                for (i=0;i<=15;i++)
                {
                  PORTD&=~(1<<rclk);
                  for (j=b;j<=n;j++)
                  {
                        for (k=0;k<=1;k++)
                            sendbyte(d);
                  }
                  PORTD&=0Xf0;
                  PORTD|=(1<<rclk);
                  PORTD|=i;
                }
            }
      }   
}

voidx 发表于 2009-11-13 12:27:26

原来就听说GCC的效率不高
-------------------------
GCC效率再怎么不高,也比ICC要高。

ATFATFATF 发表于 2009-11-13 12:39:02

GCC效率再怎么不高,也比ICC要高。
-------------------------
这不是我说的,我看IAR宣传手册上面给出的效率比较图,ICC确实比GCC高,既然你这么肯定GCC比ICC高,那你看我上面的图,怎么解释呢,周立功的TK的问题?

snoopyzz 发表于 2009-11-13 12:41:43

GCC要开优化级别,估计LZ是O0级,即不优化,一般用O2级

voidx 发表于 2009-11-13 12:42:02

楼主吧程序改一下吧,while(1)循环都没有。

改成一个单独的函数(这个函数不调用延时函数),比较这个函数的执行时间。

ATFATFATF 发表于 2009-11-13 13:58:39

楼主吧程序改一下吧,while(1)循环都没有。

改成一个单独的函数(这个函数不调用延时函数),比较这个函数的执行时间。
/************************************/
我的程序循环其实很久很久的,所以没加while(1)也要花很长时间才能跑完。你看我的函数就没有调用延时函数啊,就是很多很多的循环,我设置断点,也就是测他每次执行一次相应循环的时间。

shark 发表于 2009-11-13 14:50:20

【2楼】 ATFATFATF R/C独行侠
这不是我说的,我看IAR宣传手册上面给出的效率比较图,ICC确实比GCC高,既然你这么肯定GCC比ICC高,那你看我上面的图,怎么解释呢,周立功的TK的问题?
_________________________
IAR宣传ICC比GCC高,呵,你搞错了,是IAR比GCC高, ICC不是IAR公司的产品,是一个Image Craft的公司的。

你的问题可能原因是TK的集成环境中配置优化级别和AVRStudio不同,可能是-O0,而AVRStudio 里是-Os 。

aozima 发表于 2009-11-13 15:02:07

楼主所设断点处是刚开始进入循环吧?
而不是循环入口处到循环执行完的时间差.

对了,TKS里面怎么弄出那个带时钟周期显示的调试界面?
刚下了个好像没显示..不知道在哪里弄?

ATFATFATF 发表于 2009-11-14 21:40:26

确实是优化设置的问题,我设置了一级优化,循环次数就从差不多两万减少到了400左右多,天啊!少了30多倍啊!怎么回事呢?为什么要有优化级别这个选项呢,代码不应该是越少越好的吗?

voidx 发表于 2009-11-14 22:01:11

ICC和IAR完全是两个不同的编译器。

IAR效率当然高,是目前所有AVR编译器最高的。
ICC嘛,不是最差,也离最差差不到哪去。

yyccaa 发表于 2009-11-14 22:31:02

优化后,汇编与c代码不再是一一对应关系,不便于调试(除非熟悉汇编)。另外,开启优化对编程人员的语法要求更加严格。
我经常会接触到ICC的工程,一般来说,效率确实低于gcc(即使ICC开启优化[顺便抱怨下,我接触到的、用ICC的程序员,代码风格普遍很差,比如没有规范化的缩进风格])。
由于GCC基本上以速度优化为优先,所以IAR与GCC比最小flash空间优化的话,有一些差距。

ATFATFATF 发表于 2009-11-16 09:04:57

优化后,汇编与c代码不再是一一对应关系,不便于调试(除非熟悉汇编)。另外,开启优化对编程人员的语法要求更加严格。
我经常会接触到ICC的工程,一般来说,效率确实低于gcc(即使ICC开启优化[顺便抱怨下,我接触到的、用ICC的程序员,代码风格普遍很差,比如没有规范化的缩进风格])。
由于GCC基本上以速度优化为优先,所以IAR与GCC比最小flash空间优化的话,有一些差距。
  /********************************************/
ICC也可以开代码优化?选项在哪里呢,我好像都没有发现诶。。。。。。。。

kangkang 发表于 2009-12-14 21:23:02

学到东西了!

gliet_su 发表于 2009-12-14 22:42:58

我就用ICC,没有什么差不差的感觉 。

xtldw 发表于 2014-4-23 08:53:01

这样的对比看不到真真的内在,只能是一步一步比较,2软件不能优化,即使是同一等级的优化也不行.
页: [1]
查看完整版本: TKSTUDIO中GCC与ICC编译效率询问(有图有真相)