文本替换效率

时间:2009-02-12 19:01:46

标签: java string performance

我上一个问题的扩展:
Text cleaning and replacement: delete \n from a text in Java

我正在清理这个来自具有不规则文本的数据库的传入文本。这意味着,没有标准或规则。有些包含HTML字符,如& reg,& trade,& lt,以及其他类型的内容:&#8221,&#8211等。其他时候,我只是使用<<<和>。

我正在使用String.replace来替换字符的含义(这应该没问题,因为我正在使用UTF-8吗?),并且用replaceAll()来删除带有正则表达式的HTML标记。

除了为每次替换调用replace()函数以及编译 HTML 标记正则表达式之外,是否有任何建议使这种替换有效?

3 个答案:

答案 0 :(得分:8)

我的第一个建议是衡量最简单的方法(可能是多次替换/替换所有调用)的性能。是的,它可能效率低下。通常,最简单的方法是效率低下。你需要问自己:你关心多少?

您是否有样本数据和阈值,此时性能可以接受?如果你不这样做,那就是第一个停靠港。然后测试天真的实现,看看它是否真的 是一个问题。 (请记住,字符串替换几乎肯定只是你正在做的事情的部分。当你从数据库中提取文本时,可能很好最终成为瓶颈。)

一旦你确定更换确实是瓶颈,那么值得进行一些测试以确定替换的哪些导致了最大的问题 - 听起来你正在做几个不同的各种更换。缩小范围越多越好:您可能会发现最简单代码中的真正瓶颈是由合理简单方式中易于提高效率的东西引起的,而尝试优化< em>所有会更难。

答案 1 :(得分:3)

使用replaceAll替换你会遇到性能瓶颈。

如果您想提高效果

  1. 不使用替换 - 字符串是不可变的。每次调用replace
  2. 时都会创建副本
  3. 不要使用正则表达式(replaceAll) - 虽然编译它并没有那么糟糕。
  4. 使用StringBuilder
  5. 解析并替换您自己的字符串

    您的一些代码可能有助于讨论。

    String str = ...
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < str.length(); i++) {
      char toAppend = 'a';
      switch (str.charAt(i)) {
         case '&' : toAppend = '&'; break;
         case ...
          ...
          default: toAppend = str.charAt(i);
        }
       sb.append(toAppend);
      }
    

    来自:Sun Forums

答案 2 :(得分:1)

字符串替换是Java非常慢,我认为你应该使用更快的语言

这里有代码示例如何替换程序集中的字符串

http://szabgab.com/talks/fundamentals_of_perl/replace-string-in-assembly-code.html