打印

sprintf 为啥这么慢?

[复制链接]
4289|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xhtwork|  楼主 | 2012-3-1 14:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
keken| | 2012-3-1 17:01 | 只看该作者
问题有点专 我还没到这个层次呢

使用特权

评论回复
板凳
keken| | 2012-3-1 17:01 | 只看该作者
帮不上 可以帮顶啦

使用特权

评论回复
地板
modernthink| | 2012-3-3 21:36 | 只看该作者
没怎么用MSP430的浮点运算库,之前用了一次,因为代码消耗的太大,就把数据改成int型处理了。
楼主C51上的测试代码是一致的嘛?会不会是测试条件不同造成的?

使用特权

评论回复
5
永远的不知| | 2012-3-4 18:08 | 只看该作者
1# xhtwork
在相同条件下的对比才有用;建议先搞清楚c51的到底是多少,应该肯定比430慢,那个机器周期都12分频的。

使用特权

评论回复
6
xhtwork|  楼主 | 2012-3-5 11:52 | 只看该作者
本帖最后由 xhtwork 于 2012-3-5 11:53 编辑

首先,不是质疑什么,我觉得msp430蛮好的。
只是就事论事讨论一下。

根据5楼的要求,我重新做了对比测试,测试方法如下:
被测试语句:sprintf(rgba,"%8.4f",vlf);
变量取值:vlf=1234.5678  //在watch窗口手工输入

测试结果(编译器版本:Keil/C51v900、IAR/EW4305.2):
C51耗时3123指令周期,若晶振为12M(指令周期1MHz),耗时3.123毫秒,执行结果1234.5680
EW430耗时19072指令周期,MCLK为1MHz时耗时19ms,执行结果为1234.5677

我想讨论的问题:
1.为何同样的C语句,编译后指令(周期)差这么多?是否精简指令集都如此?
2.对于库函数,应该都是以obj提供的,也就是都是预先编译好的。
  那么,在工程选项中是否选择硬件乘法器、选择何种级别的编译优化,对库函数没有影响?

使用特权

评论回复
7
晓风残月| | 2012-3-5 13:01 | 只看该作者
看看 学习下

使用特权

评论回复
8
TI_MCU| | 2012-3-7 10:52 | 只看该作者
1. 精简指令集的特点即是这样,同样的操作,编译出来的指令数会多很多(取决于做的事情,有些需要的指令多,有的需要的少)。同时,不同的IDE的printf库的实现都不一样,针对应用,优化的程度不同所以效率也不一样,不能作为一个比较的标准。

得出6楼的结果,比较的方式可以换下,实际上C51的频率好像就在8~24MHz之间。而430最快可以做到16MHz/24MHz,所以性能应该是这样比较出来的:二者都用12MHz。RISC和CISC的理念差异也在这里体现

2. 预先编译好的obj,工程中的选项对其无影响

使用特权

评论回复
9
娃娃啊哇| | 2012-3-7 11:24 | 只看该作者
追随专家的脚步

使用特权

评论回复
10
永远的不知| | 2012-3-7 20:41 | 只看该作者
本帖最后由 永远的不知 于 2012-3-7 21:29 编辑

8# TI_MCU
主要还有由于楼主用的开发环境不同,是不是用的库中的sprintf()功能不同?
我原来用汇编编过很多程序,430有很多指令在4个周期左右(和寻址方式有关),c51大多数指令是2周期;当然,在同等晶振频率下,430还是比51快的多。

使用特权

评论回复
11
aass1| | 2012-3-7 21:16 | 只看该作者
回答好专业啊 不愧为i专家

使用特权

评论回复
12
xhtwork|  楼主 | 2012-3-8 08:48 | 只看该作者
回复8楼:
1. 精简指令集特点就是这样,简单的句子也可能会编译出一大坨,这个认可。
  我在6楼也这么推测,只是以前没直接比较过,没直观认识到差别这么巨大。

2. 诸如sprintf之类的函数,显然需要大量乘除法运算。
   如果库函数对硬件乘法器的使用不受选项卡影响,难道库函数都不用硬件乘法器?
   好像也有人说:‘编译器根据所选CPU自动决定是否使用硬件乘法器’。此说法是否确实?有出处否?


回10楼:
帖子虽然是拿51与430做比较,但只是工作中碰到问题,就事论事。觉得讨论讨论也好。
无意概念化地讨论谁快谁慢之类的问题。
我现在正弄的几个项目都是用的430.

使用特权

评论回复
13
永远的不知| | 2012-3-8 09:45 | 只看该作者
12# xhtwork
指令数多的不一定多,但430的指令占得周期数比较多。

使用特权

评论回复
14
TI_MCU| | 2012-3-9 16:33 | 只看该作者
12# xhtwork

你听到的说法是对的,编译器会根据内核情况选用合适的硬件。静态库文件是否使用到硬件的乘法器,决定于编译时候编译器的配置

使用特权

评论回复
15
xhtwork|  楼主 | 2012-3-13 23:28 | 只看该作者
刚才又简单测试了一下,同样几个简单语句,编译选项卡分别选msp430F435、msp430F449,区别如下(其中vlf1=1234.5678、vlf2=5678.1234):

-----------------------------------------------------------------------------------
C语句                               435指令               449指令
-----------------------------------------------------------------------------------
sprintf(rgba,"%8.4f",vlf1);             19274                         19069
vlf=sin(vlf1);                                     5601                           4407
vlf=vlf1*vlf2;                                      349                            188
-----------------------------------------------------------------------------------

接受“编译器会根据内核情况选用合适的硬件”的说法。

使用特权

评论回复
16
tianm| | 2012-3-14 09:02 | 只看该作者
为了符合 ANSI C

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

154

帖子

4

粉丝