关键字:软件 性能 性能设计
[前言] 开发人员一般都是在软件开发结束时才会考虑到性能管理问题。通常情况下,只有等到开发工作的尾声才会进行性能方面的调节工作,希望以此来避免在整个开发周期都需要考虑这个问题━━在许多情况下,这个策略也许是成功的。然而,早期的设计决策会对性能调节是否成功以及是否有必要进行性能调节产生影响。如果你开发的软件对性能非常敏感,从设计阶段和开发周期的第一天起就应该考虑到性能管理的问题。
接口设计对软件性能的影响
性能方面的问题有好多种。最容易修正的一种是,在执行一项计算任务时使用了一个性能不好的算法,例如,在对数目很多的数据进行排序时采用了起泡算法,每次使用时对一个经常使用的数据项进行计算而不是将它保存起来,这些问题一般我们都能很容易发现,而且一旦发现后,都能很方便地进行改正。然后,许多Java程序性能方面的问题都是是由一些比较深奥的、不容易修改的代码━━程序组件的接口设计引起的。
临时对象对软件性能的影响
本文将对早期的设计决策如何影响应用程序的性能这个问题作了一些有益的探索。在这篇文章中,我们将讨论在性能方面最常见的问题之一:临时对象的创建。一个类的对象创建活动是在早期的设计阶段就确定下来的,可能引发在后期出现的性能方面的问题。
数据类型对软件性能的影响
本文中将讨论过多地创建临时对象的问题并提供一些成熟的技术来避免过多地创建临时对象。临时对象的存在时间一般都比较短暂,除了作为其他数据的容器外,没有其他什么用途,开发人员一般用它向方法传递数据或从方法中返回数据
优化软件性能的方法
在最初版本的Swing工具包中,创建过多的Point、Rectangle和Dimension对象会严重地影响程序的性能。尽管一次在一个Point或Rectangle对象中返回多个值似乎更有效率,但这样作的代价要比调用多个方法高得多
接口设计对软件性能的影响
性能方面的问题有好多种。最容易修正的一种是,在执行一项计算任务时使用了一个性能不好的算法,例如,在对数目很多的数据进行排序时采用了起泡算法,每次使用时对一个经常使用的数据项进行计算而不是将它保存起来,这些问题一般我们都能很容易发现,而且一旦发现后,都能很方便地进行改正。然而,许多Java程序性能方面的问题都是是由一些比较深奥的、不容易修改的代码━━程序组件的接口设计引起的。
大多数的程序都是由内部人员开发的或从外部购买的组件"组装"而成的。即使软件不完全依赖于原有的组件,面向对象的设计过程也使得应用程序在开发时采用组件形式,因为这样可以简化程序的设计、开发和调试方面的工作。尽管采用组件的好处是不可否认的,我们还应该意识到组件的接口会对使用它们的程序的性能和运行状态产生重大的影响。
也许会有读者问,接口跟性能有什么关系?一个类的接口不但定义了类可以完成的功能,而且还定义了它的对象创建行为和使用它所需要调用的方法的顺序,一个类如何定义它的构造器和方法会影响这个对象是否可以重用,是它本身的方法创建还是要求其客户创建中间对象,客户要使用这个类需要调用多少个方法。
所有这些因素都会影响到程序的性能。Java软件性能管理方面的基本原理之一是:避免创建过多的对象。这并不意味着你不能创建任何对象从而不充分利用面象对象语言带来的诸多好处,而是说在开发对性能敏感的代码时需要对对象的创建保持谨慎。对象创建的代价相当高昂,我们应该在对性能敏感的软件中尽量避免创建临时或中间对象。
在处理字符的程序中,String类是引起对象创建的最大源。因为String类是不可变的,每当一个String类的对象被修改或构造时,都会创建一个新的对象。因此,一个具有性能意识的编程人员总是避免过多地使用String类对象。然而,尽管你在编程中尽量避免使用String对象,还是会经常发现使用的组件接口必须使用String对象,因此,你不可能不使用String类对象。
例子:表达式的匹配
作为一个例子,可以假设你在编写一个名字为MailBot的邮件服务器。MailBot需要处理每个邮件顶部的MIME头部━━例如发送日期或者发送者的邮件地址,它将通过使用一个匹配表达式的组件处理MIME头部,以使这一处理过程会更简单一些。它把输入的字符放在一个字符缓冲区中,通过对缓冲区进行索引处理标题。由于MailBot将调用这一表达式匹配子程序来处理每一个标题,因此这个匹配子程序的性能将十分地重要。
我们首先来看一个性能十分低下的表达式匹配类的接口:
public class AwfulRegExpMatcher {
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/