浅论工具于嵌入式软件性能优化工作的重要性
作者:AnyEmb
日期:
摘要:通过论述性能与优化的概念,指出“知道在哪优化比如何优化更重要”,认为软件性能优化工作的关键在于定位系统性能瓶颈,即系统运行热点。工具在寻找及定位系统运行热点方面比专家更为精确且客观,有利于降低成本,提高效率。嵌入式软件囿于资源限制和测试方式等,工具的介入对于提升嵌入式软件的性能显得尤为重要!
关键字:工具 性能优化 性能瓶颈 运行热点
性能与优化
性能,是所有软件系统的质量属性之一,是对功能的进一步阐述。性能就是功能与所需要资源的比值。功能是静态的概念;性能则是动态的概念,其值是因应不同的功能与应用环境而有所不同。
一个完整的软件系统在需求阶段结束之时,都会给出该系统的功能属性和性能属性。一般而言,在项目初始阶段,研发人员通常考虑最多的是如何实现诸多功能,而很少关注如何保证系统的性能达标。往往在遇到无法添加新功能或者功能全部实现但性能却不达标的情况,才会开始重视系统性能。不过,就算在需求、设计以及实现阶段都考虑到性能,可以使得模块最优化。但是,所有模块的最优整合在一起以后,不见得就能使系统最优化,即系统的性能最高。因此,往往在实现阶段不必牺牲可读性、可维护性以及可扩展性去满足模块的性能最优。所以,对于一些复杂系统而言,在某一阶段进行系统性能优化几乎无可避免。
性能优化,简单而言,就是提高软件工作效率,即用更少的资源(CPU、内存、时间等)实现相同的功能,或者用相同的资源实现更多的功能。
优化思路
对于一个复杂软件系统而言,软件优化应包括两方面的含义,即如何优化和在哪优化。作者认为,知道在哪优化比如何优化更重要。为什么呢?因为许多如何优化软件的方法和技巧现成且通用(更多优化技术可以参考Steve的《代码大全(第2版)》),但是如果不晓得在哪实施这些方法和技巧,结果势必事倍功半,甚至无功而返。
实施优化方法和技巧的地方就是系统的性能瓶颈所在。问题转换为怎样才能定位系统性能瓶颈?用传统的代码走查办法来审视每一行代码未必行得通,一下子陷入几十万行代码的系统,犹如跌入无底洞;况且代码走查是静态行为,又如何预知实际的运行情况呢?
通常情况下,性能优化的工作思路是这样的。首先,对现有系统的性能进行评估,制定优化目标;其次,召集系统专家使用头脑风暴等方法预设当前系统可能存在的多个性能瓶颈;接着,测试这些瓶颈点,收集数据,分析改进及验证,观察对系统性能改善是否有所帮助。反复重复后面两步,直到性能达标为止。不难想象,决定优化工作的效率在于系统专家预设的性能瓶颈是否准确。系统专家判断的准确性又依赖专家本身对系统的熟悉程度以及在优化工作方面的经验积累。正所谓“千军易得,一将难求”,在性能优化领域,一个专家的重要性是大量普通开发人员所不能比拟的,前者甚至可能决定着性能优化目标能否顺利完成。
运行热点
专家也有考虑不周的时候,注定了在优化过程中参杂着许多无用功。能否减少专家的负影响,同时又能把他们的丰富经验为普通开发人员所用?对于专家而言,很难,但是有一种东西可以替代专家预设性能瓶颈的功能,那就是工具——性能分析工具。性能分析工具以真实的运行数据来定位系统性能瓶颈,精确且客观。那么,定位出来的性能瓶颈要具有怎样的粒度,才是最适合直接运用优化技术来进行改进?为了回答此问题,需要引入一个术语——运行热点。
如果实现软件系统功能的算法是灵魂,那么一个有终始点的连续指令集就是这个灵魂的载体。不管算法如何纷繁复杂,功能的实现最终还得靠运行此段或彼段指令。因为软件存在判断和循环流程结构,以及各指令段(代码段)的长度不一致,所以必然导致各段指令(代码)的运行频率和运行时间(即通常所说的CPU占用率)不均匀。我们把运行频率较高或运行时间较长的一段指令(代码)称为运行热点。图1是软件系统热点示意图。
运行热点就是影响系统性能的瓶颈所在,如果找到了系统运行热点,就能利用现有的众多优化方法和技巧来实现优化,突破瓶颈。很显然,适当的热点粒度,利于解决瓶颈问题。商用的嵌入式操作系统一般提供了任务切换的钩子函数,借此可以统计出各任务CPU占用率,所以该系统的运行热点就只能以任务来描述,见图1-(1)。热点的粒度如此大,以至开发人员仍无法高效地降低其CPU占用率。
比任务更小一级的逻辑实体是函数,如果能够把运行热点的粒度缩小为函数,即精确地描述每一个函数被调用及占用CPU的情况,并给出相应的函数调用图,那么就可以快速找出影响性能的瓶颈,从而实现优化。图1-(2)是运行热点为函数的示意图。
(1)
(2)
图1 软件系统热点示意图
从技术角度而论,热点的粒度可以进一步缩小到代码块,甚至某一行语句。只是如此小粒度的热点对提升复杂软件系统性能的作用不大,可以不去考虑。
工具的作用
很显然,在性能优化工作过程中,性能分析工具的作用及目的在于快速找出系统运行热点,定位系统性能瓶颈。
上文提到,运行热点是运行频率较高或运行时间较长的一段指令(代码)。也就是说,运行热点关注的是一个相对值,而不是绝对值。譬如,假设一个系统只有三个函数,它们分别为函数r、函数p和函数q,各函数的独立运行时间分别为1毫秒、0.2毫秒和0.09毫秒。显然,函数r为系统的运行热点,其原因不在于1毫秒运行时间本身,而在于它较其它两个函数的运行时间要长。不管是纯软件性能分析工具还是半软半硬的性能分析工具,它们测得的运行时间肯定与实际运行时间有所偏差,但并不削弱性能分析工具在快速定位系统性能瓶颈方面所起到的作用!
在桌面应用程序领域,存在大量可以定位程序性能瓶颈的工具,并且测试方便。但对于嵌入式软件,每一次测试都需要经过主机编译、下载运行以及数据收集分析等步骤,花费时间长,因而工具对于嵌入式软件性能优化尤为重要,做到有的放矢,降低成本,提高效率。
<完>
<版权所有,欢迎转载>
作者联系方式:
QQ:741918060
E-mail : AnyEmb@126.com
MSN : AnyEmb@hotmail.com