大多數的程序都是由內部人員開發的或從外部購買的組件"組裝"而成的。即使軟件不完全依賴于原有的組件,面向對象的設計過程也使得應用程序在開發時采用組件形式,因為這樣可以簡化程序的設計、開發和調試方面的工作。盡管采用組件的好處是不可否認的,我們還應該意識到組件的接口會對使用它們的程序的性能和運行狀態產生重大的影響。
也許會有讀者問,接口跟性能有什么關系?一個類的接口不但定義了類可以完成的功能,而且還定義了它的對象創建行為和使用它所需要調用的方法的順序,一個類如何定義它的構造器和方法會影響這個對象是否可以重用,是它本身的方法創建還是要求其客戶創建中間對象,客戶要使用這個類需要調用多少個方法。
所有這些因素都會影響到程序的性能。Java軟件性能管理方面的基本原理之一是:避免創建過多的對象。這并不意味著你不能創建任何對象從而不充分利用面象對象語言帶來的諸多好處,而是說在開發對性能敏感的代碼時需要對對象的創建保持謹慎。對象創建的代價相當高昂,我們應該在對性能敏感的軟件中盡量避免創建臨時或中間對象。
在處理字符的程序中,String類是引起對象創建的最大源。因為String類是不可變的,每當一個String類的對象被修改或構造時,都會創建一個新的對象。因此,一個具有性能意識的編程人員總是避免過多地使用String類對象。然而,盡管你在編程中盡量避免使用String對象,還是會經常發現使用的組件接口必須使用String對象,因此,你不可能不使用String類對象。
例子:表達式的匹配
作為一個例子,可以假設你在編寫一個名字為MailBot的郵件服務器。MailBot需要處理每個郵件頂部的MIME頭部━━例如發送日期或者發送者的郵件地址,它將通過使用一個匹配表達式的組件處理MIME頭部,以使這一處理過程會更簡單一些。它把輸入的字符放在一個字符緩沖區中,通過對緩沖區進行索引處理標題。由于MailBot將調用這一表達式匹配子程序來處理每一個標題,因此這個匹配子程序的性能將十分地重要。
我們首先來看一個性能十分低下的表達式匹配類的接口:
public class AwfulRegExpMatcher {
/**創建一個給定表達式的匹配過程,它將對給定的字符串進行處理*/
public AwfulRegExpMatcher(String regExp, String inputText);
/**找到針對輸入文本的下一個匹配模式,如果匹配,返回匹配的文本,否則返回一個空字符 */
public String getNextMatch();
}
文章來源于領測軟件測試網 http://www.kjueaiud.com/