即使這個類采用了一個很高效的匹配算法,大量調用它的程序的性能也不會很好。因為匹配器對象是與輸入文本捆綁在一起的,每次調用它時,都需要首先生成一個新的匹配器對象。由于我們的目標是減少不必要的對象創建工作,實現對匹配過程代碼的重用應該是一個良好的開端。
下面的這個類定義了匹配器的另一種可能的接口,它允許匹配器重用,但性能仍然不夠好:
public class BadRegExpMatcher {
public BadRegExpMatcher(String regExp);
/** 試圖針對輸入文本匹配指定的表達式,如果匹配則返回匹配的文本,否則返回一個空白字符串*/
public String match(String inputText);
/** 得到下一個匹配的字符,否則返回一個空白字符*/
public String getNextMatch();
}
避開返回的匹配子表達式等敏感的表達式匹配問題不談,這個類的定義有什么問題嗎?如果僅僅從其功能方面看,它沒有任何問題,但如果從性能方面來考慮,則它存在許多問題。首先,匹配器要求其調用者創建一個String類來表示被匹配的文本。MailBot應該盡量避免生成String對象,但當它發現一個需要處理的標題時,它必須創建一個String對象供BadRegExpMatcher調用:
BadRegExpMatcher dateMatcher = new BadRegExpMatcher(...);
while (...) {
...
String headerLine = new String(myBuffer, thisHeaderStart,
thisHeaderEnd-thisHeaderStart);
String result = dateMatcher.match(headerLine);
if (result == null) { ... }
}
文章來源于領測軟件測試網 http://www.kjueaiud.com/