优化正则表达式

时间:2015-03-23 17:37:26

标签: java regex optimization

我正在使用jprofiler来帮助我减少CPU使用率。以下是我的两个场景:

情景1:

//Global Variables
    static Pattern escapeSequences = Pattern.compile("(\\r|\\n|\\t)");
    static Pattern printableCharacters = Pattern.compile("[^\\p{Print}]");

     String message = String.format(format, args);


          return printableCharacters.matcher(escapeSequences.matcher(message).replaceAll("")).replaceAll("?");

情景2:

            for (int i=0; i<args.length; ++i) {
                if (args[i] instanceof String) {
                    args[i].replaceAll("(\\r|\\n|\\t)","").replaceAll("[^\\p{Print}]", "?");
                }
            }

return formater = String.format(format, args);

场景1以大约9%的速度运行,而场景2以大约7%的速度运行。我在这里不明白的是,如果正则表达式是预编译一次而不是每次,为什么cpu更高?我该怎么做才能将CPU降低到7%以下。

1 个答案:

答案 0 :(得分:1)

我认为以下一行:String.format(format, args);是原因。

在第一个示例中,您在替换字符之前执行它,在第二个示例中,您执行此操作。根据{{​​1}}变量,处理后的字符串在第一个示例中可能会变得更大,从而影响执行时间。

此外,在第二个示例中,循环没有做任何有用的事情 - format创建新的replaceAll引用,并且您没有在任何地方分配它。编译器可能只是优化此部分并抛弃此循环。底线是结果与第一个例子返回的结果不同。