【学习笔记三】原创,拷贝函数效率在KEIL下的测试

2020-02-20 20:39发布

本帖最后由 sunnyqd 于 2014-9-14 18:36 编辑

本打算弄一个三平台下的速度测试,但卡在IAR上面了,IAR工程一直进hardfault
先把KEIL上的结果贴出来吧O3,OTime,不使用Microlib,指定no_inline

进行如下的内存设置
2014-9-14 15-03-42.jpg (247.88 KB, 下载次数: 0) 下载附件 2014-9-14 16:59 上传

编辑原因:添加microlib结果,更改错误
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
25条回答
dr2001
1楼-- · 2020-02-22 08:56
本帖最后由 dr2001 于 2014-9-14 20:47 编辑

需要考虑:源地址指针、目的地址指针是多少字节对齐;复制的字节数是多少的倍数,比如1/2/4/8。产生的结果可能都有差异,甚至是明显差异。
对ARM常见指令集来说,减法还是可能会快的,但不像51的DJNZ那样明显。因为SUB指令有Z标志可用,寄存器紧张的时候有价值,平时就没啥了。

此外,由于ARM指令可以地址自增,所以常见编译器优化的方法,是先算出来目的地址,然后指针增加,最后CMP目的地址,再JMP。

  1. tgt=dst + len;
  2. while(dst != tgt) {
  3.   *dst++=*src++;
  4. }
复制代码
一般这种会快,循环内就是LDR/LDM,STR/STM,CMP,B四条指令。
当然,具体的还是要查指令集,考察可用寄存器数量,指令长度(16/32)等等的因素,确定了指令之后描C代码;复杂指令因为32Bit,消耗Flash带宽,不一定是最优解。
sunnyqd
2楼-- · 2020-02-22 11:44
takashiki 发表于 2014-9-14 18:44
楼主,再比较一下大数据量的拷贝结果看看,然后把DMA的也放进来比较一下。我猜是小数据量时库函数效率最高 ...

是的,按我以往的尝试,DMA效率最高的,但是KE02没有DMA,我这里只有KE02的板子
sunnyqd
3楼-- · 2020-02-22 15:06
wxfje 发表于 2014-9-14 20:11
楼主,intmemcpy2和intmemcpy3这两个函数是一样的,,运行结果却不一样,是不是楼主把函数贴错了 ...

不一样啊,仔细看size参数,一个是int,一个是uint
sunnyqd
4楼-- · 2020-02-22 20:02
 精彩回答 2  元偷偷看……
sunnyqd
5楼-- · 2020-02-23 00:04
dr2001 发表于 2014-9-14 20:40
需要考虑:源地址指针、目的地址指针是多少字节对齐;复制的字节数是多少的倍数,比如1/2/4/8。产生的结果 ...

是的,intmemcpy和intmemcpy4是比较常规的写法,速度是四个intmemcpy里最快的
wxfje
6楼-- · 2020-02-23 02:57
sunnyqd 发表于 2014-9-14 21:43
不一样啊,仔细看size参数,一个是int,一个是uint

这可想到真周到细致,谢谢回复

一周热门 更多>