- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言代码优化
C 代码优化1. 重要的80-20规则
不要忘记由经验确定的 80-20 规则,它宣称一个典型的程序用 80% 的时间执行 20% 的代码。
这是一个重要的规则,因为它提醒你作为一个软件开发者的目标是识别出能全面提升你的程序性能的 20% 的代码。
你可以用各种方式无限期地优化你的函数,但除非你将精力集中在正确的函数上,否则就是白白浪费精力。
2. 用指针运算代替数组索引
这样做常常能产生又快又短的代码。与数组索引相比,指针一般能使代码速度更快,占用空间更少。使用多维数组时差异更明显。下面的代码作用是相同的,但是效率不一样。
数组索引??
for(;;){??
????a?=?array[t++];??
????……??
}??指针运算??
p?=?array;??
for(;;){??
????a?=?*(p++);??
????……??
}??指针方法的优点是,array的地址每次装入地址p后,在每次循环中只需对p增量操作。在数组索引方法中,每次循环中都必须根据t值求数组下标的复杂运算。
3.? 查表(游戏程序员必修课)
一个聪明的游戏大虾,基本上不会在自己的主循环里搞什么运算工作,绝对是先计算好了,再到循环里查表。看下面的例子:
旧代码:
long?factorial(int?i)???
{???
????if?(i?==?0)???
???return?1;???
else???
???return?i?*?factorial(i?-?1);???
}??
新代码:
static?long?factorial_table[]?=?{1,?1,?2,?6,?24,?120,?720??/*?etc?*/?};???
long?factorial(int?i)???
{???
return?factorial_table[i];???
}??如果表很大,不好写,就写一个init函数,在循环外临时生成表格。
4. 结构体成员的布局
把长的类型放在短的前面, 可以避免内存的空洞.
5. 提升循环的性能
要提升循环的性能,减少多余的常量计算非常有用(比如,不随循环变化的计算)。
6. Inline函数
在C++中,关键字Inline可以被加入到任何函数的声明中。这个关键字请求编译器用函数内部的代码替换所有对于指出的函数的调用。这样做在两个方面快于函数调用:第一,省去了调用指令需要的执行时间;第二,省去了传递变元和传递过程需要的时间。但是使用这种方法在优化程序速度的同时,程序长度变大了,因此需要更多的ROM。使用这种优化在Inline函数频繁调用并且只包含几行代码的时候是最有效的。
7. 减少函数调用参数
使用全局变量比函数传递参数更加有效率。这样做去除了函数调用参数入栈和函数完成后参数出栈所需要的时间。然而决定使用全局变量会影响程序的模块化和重入,故要慎重使用。
8. static-把本地函数声明为静态的
如果一个函数只在实现它的文件中被使用,把它声明为静态的(static)以强制使用内部连接。否则,默认的情况下会把函数定义为外部连接。这样可能会影响某些编译器的优化——比如,自动内联。
9. 参数、返回值、局部变量
尽量使用32bit数据类型;因为多数ARM处理器的操作是32bit的,8bit或16bit回增加操作的指令数(代码1),并且这样可以保证边界对齐;
参数不要超过4个,返回值尽量是32bit数据类型,因为ARM遵循ATPCS要求,前四个参数使用寄存器(r0-r3)传递,返回值用r0传递,多余的参数用栈传递;
局部变量不要超过12个,ARM编译器通常将全局变量定位在存储空间中,局部变量分配给通用寄存器,ARM中可通用的寄存器是12个;
intwordinc(inta)????????word_inc???
{???????????ADD?a1,a1,#1???
????return?a?+?1;???MOV?pc,lr???
}?????????
shortshortinc(shorta)???short_inc???
{???????????ADD?a1,a1,#1???
????return?a?+?1;???MOV?a1,a1,LSL?#16???
}???????????MOV?a1,a1,ASR?#16??
????????????MOV?pc,lr???
??
charcharinc(chara)??char_inc???
{???????????ADD?a1,a1,#1???
????return?a?+?1;???AND?a1,a1,#ff???
}???????????MOV?pc,lr???
可以看出,?操作3?2?位变量所需的指令要少于操作8位及16?位变量。??
10. 除法
A
文档评论(0)