软件性能与软件优化幻灯片.ppt

  1. 1、本文档共50页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
二.设计阶段的性能设计 7. CPU的特性 : iv:字节对齐 对于系统中的大量数据拷贝,应该在设计的时侯就要考虑到字节对齐,这样在调用memcpy的时侯,会很容易的进行字拷贝,长字拷贝,效率差别很大,字节对齐一定要在设计阶段考虑进来,特别是缓冲区的设计; memcpy的实现机制; 二.设计阶段的性能设计 7.动态内存分配 (1)对于频繁使用的数据结构,不要每次使用时候分配内存,使用后马上释放。否则,如果你是在一个循环体内使用它的,就会花费很多时间在分配和释放内存上。 (2)内存分配方式的选择。使用标准C运行库的Malloc()和Free()是最简单也是最低效的方式; (3)创建内存管理模块; 二.设计阶段的性能设计 8.文件IO使用: 硬盘是慢速设备,文件IO操作是一个非常消耗时间的操作。 (1)使用标准C的fopen(),fread(),fwrite()等进行文件IO最简单,最低效。 (2)使用C++的IO流改进了效率,因为它往往对输出的流进行缓冲,直到缓冲满时候刷新,减少了磁访问次数。 (3)一个改进的方式是直接使用ReadFile()和WriteFile()等系统调用,自己管理缓冲区。 (4)可以剧烈的改进IO操作的两个方式是:内存映像文件和异步文件IO。 二.设计阶段的性能设计 9.缓冲区的设计 : 缓冲区,消息队列大小等,也是根据系统的吞吐量来设计,注意不要出现缓冲区过小,或者消息队列太小导致丢消息; 三.开发阶段的性能实现 开发阶段都有哪些优化方法? 三.开发阶段的性能实现 1.嵌入汇编语言 : 汇编语言的效率要比C语言高很多,特别是一些要求效率非常高的算法,都需要用汇编实现,汇编的开发效率并不高,所以,好的策略是在C程序中嵌入汇编语言。 三.开发阶段的性能实现 1.嵌入汇编语言 -举例 因为有大量的数据拷贝,系统提供的memcpy性能很低下,通过汇编代码即可看出来,通过重新写汇编代码,则可以提供比原有实现高效很多的方法,注意,这个要保证输入参数都是字对齐的,所以缓冲区也要设计成字对齐。 先前的汇编代码:略,重写的memcpy汇编代码: bcopyLongsm2m: _bcopyLongsm2m: addi r3,r3,-4 addi r4,r4,-4 mtctr r5 bcfLGOm2m: lwzu r7,4(r3) stwu r7,4(r4) bdnz bcfLGOm2m blr 三.开发阶段的性能实现 2.使用优化编译选项: 每个编译器都有自己的优化选项,如果可能,都设置成最高级的优化。初期可以不打开优化开关,但是后期一定要打开,编译开关打开后,可能系统发生异常崩溃,这多半和优化选项无关,而是系统中有时间敏感部分,在优化后,代码执行更块,导致运行异常。 举例: -o1 寄存器优化,会将局部变量优化成寄存器,性能提高很大,文件变小; -o2 局部优化,会优化汇编语句前后顺序,会在函数内部排流水线,性能提高很大,文件变小; -o3 文件级优化,部分函数会被内联,且可能会被内联后排流水线,性能提高与应用关系很大,文件可能变大; 三.开发阶段的性能实现 3.循环变量与条件判断的使用: 对于循环内有判断条件的,尽量把判断条件转移到循环语句外,这样可以避免,每次循环都进行判断操作,重要的是如果是dsp软件,这样会破坏流水线的工作,让程序效率大大降低。 for (循环条件) { if (条件判断 ) { if ((条件1) && (条件2) { continue; } do } } 三.开发阶段的性能实现 4.条件语句,switch语句的判断顺序。 对于多重条件语句,应该把执行次数最多的条件分支放在最前面,按可能的调用频率来排列顺序。 switch( tMsg.cMsgType ) { case BOARD_INFO_REQ: { /* 0x00 处理板信息请求消息:MPC860>MPC8260>C6202 OK! */ ProcessBoardInfoReq( &tMsg ); break; } case IP_ADDR_IND: { /* 0x02 处理IP地址指示消息:MPC860>MPC8260 OK! */ ProcessChangeIp( &tMsg ); break; } 三.开发阶段

文档评论(0)

***** + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档