优化具有科学和艺术两重含义。从科学角度看,优化意指具体的优化技术;而从艺术角度看,优化指的是确定在什么地方、什么时候需要优化。由此,优化可定义为“通过选择和设计数据结构、算法以及指令序列,来提高程序效率(更小、更快)的过程”。
有关优化的一个普遍存在的误解是,认为只是在应用程序开发周期的最后阶段才进行优化。而实际上,为了创建真正优化的应用程序,就必须在开发时实行优化。一般来说,优化的过程为:仔细选择算法,并在速度、大小等诸多限制因素间进行权衡,初步估计应用程序各个部分的速度和大小,再在以后的开发过程中检验上述假设。
优化的第一步是确定优化目标。优化可以从以下几个方面进行:
一般来说,不可能在几个方面同时得到优化。一个经过大小优化的应用程序往往会降低其速度;相应的,经过速度优化的应用程序则会增加其大小。由此可见,实现不同目标的优化技术往往是相抵触的。
值得注意的是,优化并不总是完全有益的。加快或降低应用程序的速度,可能导致维护或调试方面的困难;还有些优化技术与结构化的程序设计相矛盾,这在将来扩充应用程序的功能或把它嵌入其它程序时会产生麻烦。
在确定应用程序优化策略时,有三方面的问题值得考虑:优化什么、在何处优化及何时结束优化。
如果没有明确的优化目标,就会因为方向错误而浪费大量的时间。优化的目标是为了满足用户的需求。例如,速度对于计算销售税的应用程序来说就至关重要,而对于可以从 Internet 上下载的应用程序,则其大小倍受关注。所以,正确理解优化所要解决的问题所在,是确定优化策略的关键。
即使已经确定了某一优化目标,仍需在开发过程中全面考虑优化。在编写代码时,一步一步地浏览代码,仔细思考其实际发生的情况,则会帮助了解很多东西。例如,设置属性会产生许多事件,而恰好这些事件过程中有大量的代码,则无谓的设置属性语句会导致程序执行时的巨大延迟。有时优化即便是针对大小的,仍然可以在不增加大小的前提下实现速度的优化。
绝大部分的开发者不可能对应用程序的所有地方都进行优化。增加时间等于增加开发成本,所以有必要进行“优化预算”。哪些地方能够花一些时间换取最大的投资回报呢?显然,那些速度慢、代码冗长的地方最需要优化,把精力花在这样的地方就会有事半功倍的效果。
例如,速度是主要目标,则循环体往往是开始优化的好地方。一旦循环体内的操作得到加快,则该优化会被放大,倍数是循环体执行的次数。对于有大量重复的循环,减少循环体内的一个字符串操作,结果就会有很大的不同。同样的规律也可以应用于经常调用的子程序。
有时一些东西并不值得优化。例如,为了十几个项目的排序而编写一个精致的快速排序程序是没有意义的。一种排序的方法是把项目加到排序列表框中,再把它们按排好的顺序读出来。如果项目的数量巨大,则该方法效率极低;但对于少量的项目,该方法与其它方法的效率一样,而且代码出奇地简单(只是有点难解)。
在一些情况下,优化纯属浪费。如果应用程序的运行受到驱动器或网络速度的限制,则对代码的任何优化都无助于速度的提高。此时,就应设法减少因延迟而造成对用户的影响:如利用进度栏提示当前应用程序的运行状况,或利用高速缓存减小延迟,或放弃控制,这样用户在等待时可以运行其它的应用程序,等等。
详细信息 请参阅“响应鼠标和键盘事件”中的“中断后台处理”。