当前位置: 首页 > 面试题库 >

String.replaceAll比自己完成工作要慢得多

洪开济
2023-03-14
问题内容

我有一段旧代码,用于在字符串中执行查找和替换标记。

它接收地图的fromto对,遍历它们并为每个对,遍历目标字符串,将查找from使用indexOf(),并取代它的价值to。它完成对的所有工作,StringBuffer并最终返回String

我用以下代码替换了该代码:replaceAll("[,. ]*", "");
并且运行了一些比较性能测试。
比较1,000,000迭代时,我得到以下信息:

旧代码:1287ms
新代码:4605ms

长3倍!

然后,我尝试用3个调用替换它replace
replace(",", "");
replace(".", "");
replace(" ", "");

结果如下:

旧代码:1295
新代码:3524

长2倍!

知道为什么replace而且replaceAll效率如此低下吗?我可以做些什么使它更快吗?

编辑: 谢谢所有的答案-主要的问题确实是[,. ]*没有做到我想要的。将其更改为[,. ]+几乎等于非基于Regex的解决方案的性能。使用预编译的正则表达式虽然有所帮助,但却是微不足道的。(这是一个非常适合我的问题的解决方案。

测试代码:
用正则表达式替换字符串:[,。] *
用正则表达式替换字符串:[,。] +
用正则表达式替换字符串:[,。] +和预编译模式


问题答案:

尽管使用正则表达式会给性能带来 一些 影响,但它不应该那么糟糕。

注意, 每次 调用 ,using
String.replaceAll()都会编译正则表达式

您可以通过显式使用Pattern对象来避免这种情况:

Pattern p = Pattern.compile("[,. ]+");

// repeat only the following part:
String output = p.matcher(input).replaceAll("");

还要注意,使用+而不是*避免替换空字符串,因此也可以加快处理过程。



 类似资料:
  • 不幸的是,这段代码运行速度比“os.walk”慢,但为什么呢? 会不会是“为”循环导致它运行缓慢? 类似于“os.walk”的代码:(“os.walk”函数完成它的功能) 注意:我写信是为了提高自己!: 例如: 2秒内结束: 在0.5秒内:

  • 问题内容: 我有一个简单的任务:计算每个字母在一个字符串中出现的次数。我已经使用了它,但是在一个论坛上我看到了使用/比每个字母都要慢得多的信息。我认为它只能在字符串中进行一次遍历,而解决方案则必须遍历该字符串四次(在这种情况下)。为什么这么慢? 问题答案: 允许您计算任何可哈希对象,而不仅仅是子字符串。两种解决方案都是-time。您的测量结果表明,迭代和散列单个字符的开销大于运行4倍。 可以 使用

  • 问题内容: 我正在使用bigquery.go库。 在调查某些性能时,我发现我的导出(从.csv到GCS)作业(仅导出作业)从客户端启动平均需要60秒,而从WebGUI启动的同一作业大约需要20秒。这可能是什么原因? 代码如下: 问题答案: WEB UI通常具有轮询机制来检查作业何时完成,因此您可能会看到更长的时间。通常,导出到GCS的文件在WebUI中显示的时间早于作业实际完成的时间。 为了确保并

  • 问题内容: 我正在编辑从tesseract ocr获得的一些电子邮件。 这是我的代码: 但是输出不正确。 输入: 输出: 但是,当我在每次替换后将结果分配给新的String时,它都能正常工作。为什么在同一字符串中连续分配不起作用? 问题答案: 您将在Javadoc中的String.replaceAll()中注意到,第一个参数是正则表达式。 句点()和管道()以及花括号()都有特殊的含义。您需要对它

  • 我已将自动完成功能应用于两个。为此,我使用了自动完成计算器。我观察到它的速度减慢到我甚至无法输入一个字符的程度。有什么解决办法吗? 谢谢

  • DokuWiki 是一个针对小公司文件需求而開發的 Wiki引擎。DokuWiki是用程序设计语言PHP开发的并以GPL 2发布。DokuWiki基于文本存储,所以不需要数据库,其数据文件在Wiki系统外也是可读的。DokuWiki的功能齐全,支持UTF-8,最新版支持中文链接。能够单独编辑页面中的某个章节,能够自动生成目录,适合中小企业、个人使用,用作资料归档、指南、读书笔记等。DokuWiki