[技术求助] 为啥这么慢呢?

[复制链接]
243|38
 楼主 | 2018-7-11 18:40 | 显示全部楼层 ||阅读模式

sprintf(rgbhChar,"%4.4f",1234.5678);

测试了一下,这句耗时18740个机器周期。
印象里,以前测试过Keil的C51,好像比较复杂的转换也就2K~4K个机器周期(很久了,记忆准确吗?)

现CPU是msp430F449,编译器是IAR,工程选项卡里已经选了硬件乘法器。
为啥这么慢呢?
| 2018-7-11 18:57 | 显示全部楼层

没怎么用MSP430的浮点运算库,之前用了一次,因为代码消耗的太大,就把数据改成int型处理了。
楼主C51上的测试代码是一致的嘛?会不会是测试条件不同造成的?
| 2018-7-11 18:59 | 显示全部楼层
在相同条件下的对比才有用;建议先搞清楚c51的到底是多少,应该肯定比430慢,那个机器周期都12分频的。
 楼主 | 2018-7-11 19:02 | 显示全部楼层
重新做了对比测试,测试方法如下:
被测试语句: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
 楼主 | 2018-7-11 19:04 | 显示全部楼层

1.为何同样的C语句,编译后指令(周期)差这么多?是否精简指令集都如此?
2.对于库函数,应该都是以obj提供的,也就是都是预先编译好的。
  那么,在工程选项中是否选择硬件乘法器、选择何种级别的编译优化,对库函数没有影响?
| 2018-7-11 19:06 | 显示全部楼层
精简指令集的特点即是这样,同样的操作,编译出来的指令数会多很多(取决于做的事情,有些需要的指令多,有的需要的少)。同时,不同的IDE的printf库的实现都不一样,针对应用,优化的程度不同所以效率也不一样,不能作为一个比较的标准。
| 2018-7-11 19:08 | 显示全部楼层
比较的方式可以换下,实际上C51的频率好像就在8~24MHz之间。而430最快可以做到16MHz/24MHz,所以性能应该是这样比较出来的:二者都用12MHz。RISC和CISC的理念差异也在这里体现
| 2018-7-11 19:10 | 显示全部楼层

预先编译好的obj,工程中的选项对其无影响
| 2018-7-11 19:12 | 显示全部楼层

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

4个核当然要写4个main函数.
其实这里还涉及一个任务分配的问题. 撇开这个问题的话.
要发挥4核的性能.
可以让每个核做 100 次的加计算, 最后把结果加起来.
 楼主 | 2018-7-11 19:17 | 显示全部楼层

哦,这样啊
| 2018-7-11 19:19 | 显示全部楼层
你听到的说法是对的,编译器会根据内核情况选用合适的硬件。静态库文件是否使用到硬件的乘法器,决定于编译时候编译器的配置
 楼主 | 2018-7-11 19:21 | 显示全部楼层
刚才又简单测试了一下,同样几个简单语句,编译选项卡分别选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
-----------------------------------------------------------------------------------

接受“编译器会根据内核情况选用合适的硬件”的说法。
| 2018-7-11 19:24 | 显示全部楼层
为了符合 ANSI C
| 2018-7-11 19:26 | 显示全部楼层

为了符合 ANSI C
| 2018-7-11 19:28 | 显示全部楼层
我也在用IAR430,你这个执行周期在软件哪能查到啊?
| 2018-7-11 19:30 | 显示全部楼层

先转换,然后再发送,肯定运算增多了。
| 2018-7-11 19:33 | 显示全部楼层
sprintf()这个原函数的看下的
 楼主 | 2018-7-11 19:36 | 显示全部楼层

嗯,明白啦,呵呵
| 2018-7-11 21:47 | 显示全部楼层
sprintf的效率最低
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

分享 快速回复 返回顶部 返回列表