String.replaceAll比自己完成这个任务要慢得多。

10 浏览
0 Comments

String.replaceAll比自己完成这个任务要慢得多。

我有一段旧代码,用于在字符串中查找和替换标记。它接收一个fromto对的映射,遍历它们,并针对每对,在目标字符串上进行遍历,使用indexOf()查找from,并用to的值替换它。它在一个StringBuffer上完成所有工作,并最终返回一个String

我用这行代码替换了那段代码:replaceAll("[,. ]*", "");

然后我进行了一些性能比较测试。

当比较1,000,000次迭代时,得到了以下结果:

旧代码:1287ms

新代码:4605ms

多了3倍!

然后我尝试用3次调用replace来替换它:

replace(",", "");

replace(".", "");

replace(" ", "");

这导致了以下结果:

旧代码:1295

新代码:3524

多了2倍!

有什么办法可以解释为什么replacereplaceAll这么低效?我能做些什么来提高速度吗?


编辑:感谢所有的答案-主要问题确实是[,. ]*没有达到我想要的效果。将它改为[,. ]+几乎等于非正则表达式的解决方案的性能。

使用预编译的正则表达式有所帮助,但效果不大。(这是一个非常适用于我的问题的解决方案。

测试代码:

使用正则表达式替换字符串:[,. ]*

使用正则表达式替换字符串:[,. ]+

使用正则表达式替换字符串:[,. ]+和预编译模式

0