我有一堂课,正在做很多文本处理。对于每个长度在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)
  • 然后对每个pX执行以下操作:p1.matcher(str).replaceFirst(Matcher.quoteReplacement("desiredReplacement"));

  • 这样,我放弃了第一次替换(而不是遍历整个字符串),并且使用的是文字 regex ,并且我没有在每次迭代时都进行重新编译。

    那么,哪个是最佳性能?

    最佳答案

    那么,哪个是最佳性能?

    衡量吧! ;-)

    预计到达时间:由于两个字的答案听起来很难听,所以我将略作阐述。 “衡量并告诉我们...”,因为关于您引用的各种方法(好的方法,全部)的性能可能存在一些通用的经验法则,但我不知道。而且,正如对这个答案的一些评论所提到的,即使如此,不同的方法也很可能被应用程序环境所淹没。因此,如果确实存在问题,请在体内对其进行测量,并专注于此。 (并让我们知道它的进展...)

    08-04 01:04