我有一堂课,正在做很多文本处理。对于每个长度在100-> 2000个字符之间的字符串,我将执行30种不同的字符串替换。
例:
string modified;
for(int i = 0; i < num_strings; i++){
modified = runReplacements(strs[i]);
//do stuff
}
public runReplacements(String str){
str = str.replace("foo","bar");
str = str.replace("baz","beef");
....
return str;
}
'foo','baz'和所有其他“目标”仅预期出现一次并且是字符串文字(不需要实际的正则表达式)。
可以想象,我担心性能:)
鉴于这种,
replaceFirst()
似乎是一个错误的选择,因为它不使用Pattern.LITERAL
,并且会执行不需要的额外处理。 replace()
似乎是一个错误的选择,因为它将遍历整个字符串以查找要替换的多个实例。 另外,由于每次替换文本都是相同的,因此编写自己的代码似乎很有意义,否则
String.replaceFirst()
或String.replace()
将在后台每次执行一次Pattern.compile
。认为我应该编写自己的代码,这是我的想法:Pattern.compile()
一次(无需每次都重新编译)(即p1-p30)p1.matcher(str).replaceFirst(Matcher.quoteReplacement("desiredReplacement"));
这样,我放弃了第一次替换(而不是遍历整个字符串),并且使用的是文字和 regex ,并且我没有在每次迭代时都进行重新编译。
那么,哪个是最佳性能?
最佳答案
那么,哪个是最佳性能?
衡量吧! ;-)
预计到达时间:由于两个字的答案听起来很难听,所以我将略作阐述。 “衡量并告诉我们...”,因为关于您引用的各种方法(好的方法,全部)的性能可能存在一些通用的经验法则,但我不知道。而且,正如对这个答案的一些评论所提到的,即使如此,不同的方法也很可能被应用程序环境所淹没。因此,如果确实存在问题,请在体内对其进行测量,并专注于此。 (并让我们知道它的进展...)