我有一段旧代码,用于在字符串中执行查找和替换标记.
它接收from和to的映射,迭代它们,对于每个对,迭代目标字符串,查找from使用indexOf(),并用to的值替换它.它完成StringBuffer上的所有工作并最终返回一个String.
我用这一行替换了代码:replaceAll(“[,.] *”,“”);
我进行了一些比较性能测试.
当比较1,000,000次迭代时,我得到了这个:
Old Code: 1287ms
New Code: 4605ms
3倍长!
然后我尝试用3次调用替换它来代替:
replace(“,”,“”);
replace(“.”,“”);
replace(“”,“”);
结果如下:
Old Code: 1295
New Code: 3524
2倍长!
任何想法为什么替换和替换都是如此低效?我可以做些什么来加快速度吗?
编辑:感谢所有答案 – 主要问题确实是[,. ] *没有做我想做的事.将其改为[,. ]几乎等于非基于正则表达式的解决方案的性能.
使用预编译的正则表达式有所帮助,但是很少. (这是一个非常适用于我的问题的解决方案.
解决方法:
虽然使用正则表达式可以产生一些性能影响,但它不应该那么糟糕.
请注意,每次调用时,使用String.replaceAll()都会编译正则表达式.
您可以通过显式使用Pattern对象来避免这种情况:
Pattern p = Pattern.compile("[,. ]+");
// repeat only the following part:
String output = p.matcher(input).replaceAll("");
另请注意,使用而不是*避免替换空字符串,因此也可能加快进程.
标签:java,string,regex,replace
来源: https://codeday.me/bug/20190926/1818374.html