即使这个类采用了一个很高效的匹配算法,大量调用它的程序的性能也不会很好。因为匹配器对象是与输入文本捆绑在一起的,每次调用它时,都需要首先生成一个新的匹配器对象。由于我们的目标是减少不必要的对象创建工作,实现对匹配过程代码的重用应该是一个良好的开端。
下面的这个类定义了匹配器的另一种可能的接口,它允许匹配器重用,但性能仍然不够好:
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) { ... }
}
文章来源于领测软件测试网 https://www.ltesting.net/