


软件性能与软件优化(V1.2)Page 2n培训之前,你所理解的这次培训的主题;n三天的培训,我们的学习内容是哪些?n如何评估我们的项目质量;两个问题Page 3软件性能与软件质量Page 4培训目标n软件优化的经验分享;n互动参与;n优化的案例收集;n整理成文,指导以后的软件设计;Page 5 软件性能指在指定条件下,相对于资源使用总量,软件产品提供恰当的执行效果的能力,一般包括如下一些方面:1.时间响应:软件产品执行其功能时,提供恰当的响应和处理时间的能力;2.资源的使用效率:在指定条件下,软件产品执行其功能时,占用恰当的资源的能力;3.吞吐量:指单位时间内能处理的事件个数,或单位时间传输的数据量;软件性能的定义Page 6分类度量名称目标定义数据来源时间行为性响应时间完成特定任务的估计时间X=time(计算或模拟的)估算吞吐时间单位时间内估计可以完成多少任务X=单位时间的任务数)估算周转时间完成一项完整工作(包括一组相关任务)的估计时间X=time(计算或模拟的)估算资源利用性I/O利用完成特定任务预计需要的IO利用X=缓冲的数量(计算或模拟的)源代码I/O利用消息密度在系统调用中与I/O相关的消息占源代码的比例X=A/B;A=有关于I/O错误的消息数;B=直接与系统调用相关的源代码行数;源代码内存利用完成特定任务产品需要占用的内存数X=内存大小内存利用估计内存利用消息密度在系统调用中与内存利用相关的消息占源代码的比例X=A/B;A=有关于内存利用错误的消息数;B=直接与系统调用相关的源代码行数;源代码数据传递传递的效率X=数据量/时间估算性能一致性性能一致程度产品的性能与其他制度,标准和约定的一致性。
X=A/B;A=实现了性能的项数;B=需要与制度,标准和约定一致的项数;相关标准和约定;需求;设计;代码;评审报告;软件性能的度量Page 7关于软件性能n软件性能与其他质量属性的关系;n软件性能的一些误区;Page 8需求分析阶段设计阶段创建阶段测试阶段用户现场性能确定性能指标性能设计并发设计分布式设计架构设计代码级别的优化性能测试压力测试性能采集软件性能与研发阶段性能,也是设计出来的性能,也是设计出来的Page 9软件的优化 优化是一门工艺优化是一门工艺大多数人认为代码优化是放在开发周期的最后一大多数人认为代码优化是放在开发周期的最后一段,然而,要想真正的设计一个优化的程序,你必须在段,然而,要想真正的设计一个优化的程序,你必须在开发过程中就要优化,你需要认真考虑算法的选择,权开发过程中就要优化,你需要认真考虑算法的选择,权衡速度和尺寸和其他限制因素衡速度和尺寸和其他限制因素你必须关注程序中那一部分需要快或慢,对它们你必须关注程序中那一部分需要快或慢,对它们的性能做仔细的测试还有一个很重要的因素,需要权的性能做仔细的测试还有一个很重要的因素,需要权衡程序在性能和代码维护难度的比重衡程序在性能和代码维护难度的比重。
Page 10一.需求阶段的性能描述;二.设计阶段的性能设计;三.开发阶段的性能实现;四.测试阶段的性能验证;Page 11一.需求阶段的性能描述 1.列出系统的性能需求;2.用精确的数据指标来表达,包括最大吞吐量,响应和处理时间,资源的使用效率等;3.必须是系统可达到的数据指标;Page 12一.需求阶段的性能描述 我们目前存在的问题:n项目需求阶段的性能描述是否清晰?n性能的描述除了在需求阶段,还在其他阶段有所描述?n其他?Page 13举例:ZXV10某产品的性能要求 1.最大32个2M终端接入能力;2.单画面会议视频在MCU的视频延时小于200毫秒;3.关键DSP,CPU性能留有20%余量4.关键CPU留有30%以上的空闲内存;5.单板复位的时间小于6秒;6.最多16路的视频混合;Page 14二.设计阶段的性能设计设计阶段能有哪些方法提高性能?Page 15二.设计阶段的性能设计1.系统体系结构的设计:系统的体系结构从最基础架构上决定着整个系统的性能,如果这个阶段的设计作不好,对以后的研发影响很大,其他优化的设计无法弥补架构的缺陷Page 16二.设计阶段的性能设计1.系统体系结构的设计举例 i.ZXV10 MCU:分组交换和电路交换 基于分组交换的H.323协议,对数据包直接进行处理,但是因为继承原有基于时系交换的MCU,仍然采用时系交换,对于每个数据包都要进行包的拆解,时系拼凑操作,占用大量的CPU能力,也大大增加了软件复杂度,后期的性能指标很难达到。
ii.ZXJ10:MP模块 MP模块的设计采用工控机,大量操作的数据处理在本地硬盘;Page 17二.设计阶段的性能设计2.软件体系结构的设计:软件体系结构也非常重要,同样的硬件,不同的软件架构,最后的系统性能差别非常大,对于各个任务的设计,任务间通讯的方式,任务优先级的设置,任务同步的方式等,都要在系统设计阶段好好考虑进来Page 18二.设计阶段的性能设计2.软件体系结构的设计举例 i.时钟节拍的设计,太低的频率导致任务响应时间变大,太高的频率会让系统开销太高,需要根据系统特点进行选择,例如MPC8260的时钟节拍可以选择60-100;ii.对消息队列的操作,是否采用阻塞方式等;举例:为了获得高精度的定时器,采用更高的系统时钟;减少不必要的系统调用开销;Page 19二.设计阶段的性能设计3.硬件的选型:不同的处理器,性能不同,适用领域也不同,有的适用大量的运算,如DSP,有的适用通讯处理,所以,需要在芯片选型即确定哪些芯片是我们需要的,硬件选型错误带来的影响也是致命的Page 20二.设计阶段的性能设计3.CPU的选型 举例 ADI6834ADI6834IDT32438IDT32438Motorola 8260Motorola 8260IXP425IXP425内核MIPS3000MIPS4000PowerPC603EStrongARM主频200m300m200m400m指令cache16k16k32k32k数据cache8k16k32K(32+2)KSDRAM/DDR100M SDRAMDDR150M66M(64bit)SDRAM133M SDRAMPCI32bit/v2.2,带arbiter32bit/v2.2,带arbiter无32bit/v2.2,带arbiter片上SRAM32kbyte1K*32bitCPM用与dcache共用MMU支持支持支持支持GPIO16bit323216UART2222DMA61022功耗2W2.4W2.4W2.2WOSvxWorks/linuxvxWorks/linuxvxWorksvxWorks/linux使用环境ADI+linux2.4IDT+linux2.48260+VxWorks IXP425+VxWorksPage 21二.设计阶段的性能设计4.好的算法和数据结构:n选择一个好的算法和好的数据结构,其影响远远大于选择一个好的语言和好的编译器;n算法对应用程序执行速度的影响是最显著的。
n一个大量使用了排序的程序,使用堆排序的执行速度远大于使用冒泡排序的程序n算法没有好的优化的程序,即使把它按照处理器的优化指令做成了硬件版,它远还是比不上使用了优化算法的纯软件程序n在我们做优化的时候,一定要分析代码中主要使用的算法,首先考虑是否有明显更好的算法,如果有,马上放弃现有的算法,避免在低效算法上进行徒劳的优化Page 22二.设计阶段的性能设计n好的算法和数据结构:例子:ZXV10非全交换的实现;Page 23全交换的处理思路Page 24非全交换的处理思路Page 25二.设计阶段的性能设计5.改造协议栈和操作系统:底层软件的效率,很大程度依赖操作系统和协议栈,很多时候并不能满足要求,就需要定制操作系统,来完成符合要求的模块,同时,对于协议栈,因为分层结构,会导致性能的下降,在不能满足需求的时候,也要进行裁减和修改,甚至需要重写协议栈代码,根据需求来开发定制协议栈Page 26二.设计阶段的性能设计5.改造协议栈和操作系统 举例 i.改造TCP/IP协议栈:重写适用系统的协议栈;ii.完善TCP/IP协议栈:对于UDP协议处理,不在进行socket的收发处理,而是直接从IP层获得数据包进行处理,绕过UDP协议和SOCKET接口,减少内存拷贝次数,减少大量的查询操作,从而大大提高程序效率。
数据发送可以直接调用驱动层的发送函数Page 27二.设计阶段的性能设计6.驱动优化设计 优化的驱动设计可以让整个软件执行效率大大提升,有经验的开发人员,特别是底层技术专家,可以设计出非常高效的驱动程序;Page 28二.设计阶段的性能设计6.驱动优化设计 举例 单板同时处理16个2M终端数据,每秒收发数据包达到3200个,每次中断都要保存,恢复环境,占用大量CPU时间,通过设置BD表,每32个数据包产生一次中断,而不是先前的一个数据包一次中断,从而让驱动效率提升200%,系统效率提升100%同时,因为处理时间都在毫秒级别,对应用没有影响;Page 29二.设计阶段的性能设计7.CPU的特性:i.主频:很多CPU都可以工作在不同的主频下,例如MPC860T,可以在65M,50M,8260可以在200M,166M,133M等ii.DMA:对于大量数据访问,数据拷贝,DMA是提高程序效率很好的方法,但是要注意和主程序之间的异步操作DMA虽然不会占用CPU时间,但是会和CPU争夺总线资源;Page 30二.设计阶段的性能设计7.CPU的特性:iii.CACHE的打开和关闭 CACHE的打开和关闭对于程序效率差别非常大,应该尽早打开数据和程序CACHE。
同时,对于非常高效的代码,例如小的驱动程序,可以锁定到CACHE,从而提高局部代码的运行效率;Page 31二.设计阶段的性能设计7.CPU的特性:iv:字节对齐 对于系统中的大量数据拷贝,应该在设计的时侯就要考虑到字节对齐,这样在调用memcpy的时侯,会很容易的进行字拷贝,长字拷贝,效率差别很大,字节对齐一定要在设计阶段考虑进来,特别是缓冲区的设计;memcpy的实现机制;Page 32二.设计阶段的性能设计7.动态内存分配 (1)对于频繁使用的数据结构,不要每次使用时候分配内存,使用后马上释放否则,如果你是在一个循环体内使用它的,就会花费很多时间在分配和释放内存上2)内存分配方式的选择使用标准C运行库的Malloc()和Free()是最简单也是最低效的方式;(3)创建内存管理模块;Page 33二.设计阶段的性能设计 8.文件IO使用:硬盘是慢速设备,文件IO操作是一个非常消耗时间的操作1)使用标准C的fopen(),fread(),fwrite()等进行文件IO最简单,最低效2)使用C+的IO流改进了效率,因为它往往对输出的流进行缓冲,直到缓冲满时候刷新,减少了磁访问次数3)一个改进的方式是直接使用ReadFile()和WriteFile()等系统调用,自己管理缓冲区。
4)可以剧烈的改进IO操作的两个方式是:内存映像文件和异步文件IOPage 34二.设计阶段的性能设计 9.缓冲区的设计:缓冲区,消息队列大小等,也是根据系统的吞吐量来设计,注意不要出现缓冲区过小,或者消息队列太小导致丢消息;Page 35三.开发阶段的性能实现 开发阶段都有哪些优化方法?Page 36三.开发阶段的性能实现 1.嵌入汇编语言:汇编语言的效率要比C语言高很多,特别是一些要求效率非常高的算法,都需要用汇编实现,汇编的开发效率并不高,所以,好的策略是在C程序中嵌入汇编语言Page 37三.开发阶段的性能实现 1.嵌入汇编语言 举例 因为有大量的数据拷贝,系统提供的memcpy性能很低下,通过汇编代码即可看出来,通过重新写汇编代码,则可以提供比原有实现高效很多的方法,注意,这个要保证输入参数都是字对齐的,所以缓冲区也要设计成字对齐先前的汇编代码:略,重写的memcpy汇编代码:bcopyLongsm2m:_bcopyLongsm2m:addir3,r3,-4addir4,r4,-4mtctrr5bcfLGOm2m:lwzur7,4(r3)stwur7,4(r4)bdnzbcfLGOm2mblr Page 38三.开发阶段的性能实现 2.使用优化编译选项:每个编译器都有自己的优化选项,如果可能,都设置成最高级的优化。
初期可以不打开优化开关,但是后期一定要打开,编译开关打开后,可能系统发生异常崩溃,这多半和优化选项无关,而是系统中有时间敏感部分,在优化后,代码执行更块,导致运行异常举例:-o1 寄存器优化,会将局部变量优化成寄存器,性能提高很大,文件变小;-o2 局部优化,会优化汇编语句前后顺序,会在函数内部排流水线,性能提高很大,文件变小;-o3 文件级优化,部分函数会被内联,且可能会被内联后排流水线,性能提高与应用关系很大,文件可能变大;Page 39三.开发阶段的性能实现 3.循环变量与条件判断的使用:对于循环内有判断条件的,尽量把判断条件转移到循环语句外,这样可以避免,每次循环都进行判断操作,重要的是如果是dsp软件,这样会破坏流水线的工作,让程序效率大大降低for(循环条件)if(条件判断)if(条件1)&(条件2)continue;do Page 40三.开发阶段的性能实现 4.条件语句,switch语句的判断顺序对于多重条件语句,应该把执行次数最多的条件分支放在最前面,按可能的调用频率来排列顺序switch(tMsg.cMsgType)case BOARD_INFO_REQ:/*0 x00 处理板信息请求消息:MPC860-MPC8260-C6202 OK!*/ProcessBoardInfoReq(&tMsg);break;case IP_ADDR_IND:/*0 x02 处理IP地址指示消息:MPC860-MPC8260 OK!*/ProcessChangeIp(&tMsg);break;Page 41三.开发阶段的性能实现 5.注意类型转换。
一个频繁使用的循环体内作从double到int的转换会消耗可能比计算本身还多的时间Page 42三.开发阶段的性能实现 6.使用寄存器变量register会让编译器把指定变量放到寄存器,提高运行效率参数,局部变量;Page 43三.开发阶段的性能实现 7.短路语句/*如果不是UDP协议或者不是本地包,则释放,直接返回*/if(pIpHead-cProtocol!=PROTOCOL_UDP)&(g_ptEnilMng-nIP!=(*(UINT32*)pIpHead-cDestination)m_freem(*pPtrMbuf);return TRUE;Page 44四.测试阶段的性能验证 测试阶段如何验证性能?Page 45四.测试阶段的性能验证 工具软件的使用1.Rational Robot;2.CPU性能测试工具;3.大容量数据包发送软件;4.实际设备模拟软件;Page 46五.优化的关键点 性能是需要从需求,设计,实现到测试都应该考虑的内容,代码优化是一个可以永无止境的工作,优化工作可能渗透到应用程序的各个细节和软件开发的各个阶段,对软件工程的管理控制是不利的它会花费了开发人员更多的精力和时间来大量的修改代码甚至修改最初的设计。
Page 47五.优化的关键点 1.架构方面的专家;2.底层软件技术的专家;Page 48六.推广建议 性能是所有产品都要关注的质量属性,公司各个事业部在这方面的积累也非常多,如果能把各个事业部的设计案例和经验汇总起来,指导我们进行设计和实现,会有非常大的帮助;n专家的培养,一个专家胜过大量普通的开发人员,对于攻关问题的解决至关重要;n优化经验的积累,对于一个产品线非常重要;n过程数据,信息收集和总结对于优化的经验积累帮助很大,一定要保存原始的数据和优化的过程记录;n在需求,设计,实现,测试各个阶段,真正把性能重视起,而不是最终的补救;Page 49六.推荐书籍1.软件架构评估;2.软件架构实践;3.编程珠玑;4.软件优化技术IA-32平台的高性能手册;5.相关操作系统,CPU手册等;6.程序设计实践;Page 50欢迎提问和讨论n印象深刻的内容:n培训需要改进的地方:n培训值得借鉴的地方:Page 51知识回顾知识回顾Knowledge Knowledge ReviewReviewPage 52 结束语结束语若有不当之处,请指正,谢谢!若有不当之处,请指正,谢谢!。