Keil如何提升性能和减小代码大小
来源:互联网 发布:php xmlreader详解 编辑:程序博客网 时间:2024/06/06 07:28
在编译程序的过程中,需要考虑两个问题,一个是使用的代码够不够快,另一个是编译的代码够不够小,下面汇集一些解决方法,主要针对Keil ARMCC编译器:
1,让代码够小
如图 1,未进行任何优化时,keil编译生成的文件大小为:9668字节。
第一步:project >> Option for Target “**” 打开如图 2界面。选择“target”,勾选上“Use MicroLIB”再编译。
分析:microLIB是缺省的C库,而且microLIB进行了高度优化。如果不勾选“Use MicroLIB”,keil会连接标准C库。所以勾选“Use MicroLIB”会减小code大小。
第二步:project >> Option for Target “**” 打开如界面。选择“C/C++”,勾选上“One ELF Section per Functin”再编译。
分析:“One ELF Section per Functin”就是将每个函数都生成一个ELF文件,最会将需要的函数链接成一个大的ELF文件。但是如果没有勾选“One ELF Section per Functin”。Keil将每个文件编译成一个ELF文件(即使文件中用未被使用的函数),最会链接成一个ELF文件。所以勾选“One ELF Section per Functin”会使code变小。
2,让代码够快
注意使用的库函数,在使用memcpy的时候要注意,这里已经碰到了一些坑,C库函数提供的memcpy性能有待提高,所以如果代码中有大量的数据拷贝的情况,需要注意下这里的性能问题,可以自己实现这块的代码,目前找了集中memcpy的替代方案,有待验证:
(1)普通标准库的方法
void *memcpy(void *dest, const void *src, size_t count) { char *tmp = dest; const char *s = src; while (count--) *tmp++ = *s++ ; return dest; }
(2)考虑到重叠的实现方法
void *memcpy(void *dest, const void *src, size_t count) { char *d; const char *s; if (dest > (src+size)) || (dest < src)) { d = dest; s = src; while (count--) *d++ = *s++; } else /* overlap */ { d = (char *)(dest + count - 1); /* offset of pointer is from 0 */ s = (char *)(src + count -1); while (count --) *d-- = *s--; } return dest; }
(3)另外还看到一种更高效的方法,可以尝试,参考如下链接:
http://blog.163.com/lzh_327/blog/static/7219480201110184108805/
void duff_memcpy( char* to, char* from, int count ) { size_t n = (count+7)/8; switch( count%8 ) {case 7: *to++ = *from++;case 6: *to++ = *from++;case 5: *to++ = *from++;case 4: *to++ = *from++;case 3: *to++ = *from++;case 2: *to++ = *from++;case 1: *to++ = *from++;case 0: do{ *to++ = *from++;}while(--n>0); }}
- Keil如何提升性能和减小代码大小
- 如何减小NK大小
- 如何减小NK大小
- 如何减小NK大小
- 在代码中如何减小 spinner 字体的大小?
- 如何减小可执行文件的大小
- 如何减小软件包的大小
- 如何减小apk的大小
- STM32关于IAR和Keil中如何查看代码段的大小
- [DEV] 如何减小可执行文件的大小
- 如何减小lazarus编译可执行文件的大小
- 如何减小SWF文件的大小
- 如何减小编译后可执行文件的大小
- 如何减小Delphi应用程序(EXE)的大小
- 如何减小Exe, DLL 的大小
- 如何减小iOS应用程序的大小
- 如何减小APK文件的大小
- 如何减小iOS应用程序的大小
- C++ 如何 int 转 string
- accuracy_layer
- 使用js创建div、添加子div并给div设置在css中定义的class选择属性以及设置style属性
- 自己做的很好用不卡顿的弹幕View
- 如何学习一门计算机语言
- Keil如何提升性能和减小代码大小
- JS在可编辑的div中的光标位置插入内容或表情
- 【索引 index】是个好东西——大幅加快MySQL update更新速度的方法
- 安装Sublime Text 3插件的方法
- mplayer命令行模式下的使用方法
- Angular2 Http的使用
- jquery.cookie.js使用
- 好好的java项目导入新eclipse中报错
- 遍历json获得数据的几种方法