我有一个类正在做大量的文本处理。对于长度为 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"));
这样我在第一次替换时放弃了 ship(而不是遍历整个字符串),我使用的是 literal 与 regex,我没有做重新编译每一次迭代。
那么,哪种性能最好?
最佳答案
So, which is the best for performance?
测量它! ;-)
ETA:由于两个词的回答听起来无可挽回地尖酸刻薄,我将稍微详细说明一下。 “测量它并告诉我们......”因为关于你引用的各种方法(好的,所有)的性能可能有一些一般的经验法则,但我不知道。正如对此答案的一些评论所提到的那样,不同的方法很可能被应用程序环境淹没。因此,在体内 对其进行测量,如果这是一个真正的问题,请关注它。 (让我们知道进展如何...)
关于Java 的 String.replace() 与 String.replaceFirst() 与自制程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3843051/