在RegExpMatcher中,在定义接口时使用String对象对减少复杂性或增加可移植性的帮助并不大,对性能却有着相当大的影响,这么做是得不偿失的。在设计接口时使用可互换类型往往很有吸引力,因为这样能够使接口看起来更"干净"一些,但你应该确信你为此所作的折衷是明智的。有时━━就象RegExpMatcher那样,调用程序可以使用多种输入、输出格式,应该考虑如何能够更方便地满足它们的需求。
值得指出的是,对使用可互换类型对性能的影响进行量化不是一件容易的事儿。如果对调用BadRegExpMatcher的代码进行分析,它将指派运行时间库创建输入用的String对象,这个String对象是为满足BadRegExpMatcher的需求而生成的。如果要衡量一个组件对性能的真正影响,不仅需要评估代码的资源利用情况,还需要评估建立调用的代码以及调用返回的代码的资源利用情况,要使用标准的分析工具完成这些分析工作是非常困难的。
优化软件性能的方法
添加较小的辅助性函数
在最初版本的Swing工具包中,创建过多的Point、Rectangle和Dimension对象会严重地影响程序的性能。尽管一次在一个Point或Rectangle对象中返回多个值似乎更有效率,但这样作的代价要比调用多个方法高得多。在最近的Swing版本推出之前,这个问题可以通过简单地在组件或其他类中添加一些辅助性的方法得到改善,如下所示:
public int getX() { return myBounds.x; }
public int getY() { return myBounds.y; }
public int getHeight() { return myBounds.height; }
public int getWidth() { return myBounds.width; }
现在,调用程序可以在不创建临时对象的情况下得到同样的结果,如下所示:
int x = component.getX();
int y = component.getY();
int h = component.getHeight();
int w = component.getWidth();
原来的getBounds()仍然可以使用,较小的辅助性函数只不过提供了一种实现同样目标的效率更高的方法,其结果是,Rectangle的接口将完全暴露在组件的接口中。当修改Swing使之支持并可以使用这些较小的辅助性函数后,其结果是,Swing中的许多操作的运行速度都比原来快了二倍。由于GUI代码对性能比较敏感,这一改进的意义是重大的。
这种技术带来的负作用是对象拥有的方法更多了,而且要获取同一种信息可以有多种方法,这就使文件变得相当大而且也更加复杂了,不利于用户采用这一技术。但是,象Swing的例子显示的那样,在对性能要求比较高的情况下,这种优化技术还是十分有效的。
文章来源于领测软件测试网 https://www.ltesting.net/