在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的例子顯示的那樣,在對性能要求比較高的情況下,這種優化技術還是十分有效的。
文章來源于領測軟件測試網 http://www.kjueaiud.com/