我有一段旧代码,可以在字符串中执行查找和替换标记。
它收到一张地图from
and to
对,迭代它们,对于每个对,迭代目标字符串,查找from
using indexOf()
,并将其替换为to
。它完成了所有工作StringBuffer
最终返回一个String
.
我用这一行替换了该代码:replaceAll("[,. ]*", "");
我进行了一些比较性能测试。
当比较时1,000,000
迭代,我得到了这个:
旧代码:1287ms
新代码:4605ms
长3倍!
然后我尝试用 3 次调用来替换它replace
:
replace(",", "");
replace(".", "");
replace(" ", "");
这导致了以下结果:
旧代码:1295
新代码:3524
长2倍!
知道为什么吗replace
and replaceAll
都这么低效吗?我可以做点什么让它更快吗?
Edit:感谢所有的答案 - 主要问题确实是[,. ]*
没有做我想让它做的事。将其更改为[,. ]+
几乎等于非基于正则表达式的解决方案的性能。
使用预编译的正则表达式有帮助,但效果有限。 (这是一个非常适用于我的问题的解决方案。
测试代码:
将字符串替换为正则表达式:[. ]* http://ideone.com/66cVN
将字符串替换为正则表达式:[. ]+ http://ideone.com/3Ed2A
将字符串替换为正则表达式:[. ]+ 和预编译模式 http://ideone.com/tmDD1