正则表达式的优化

Optimization of Regex

我正在使用 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% 以下。

我相信下面一行:String.format(format, args);是原因。

在第一个示例中,您在替换字符之前执行它,在第二个示例中,您执行它 post。根据 format 变量,在第一个示例中处理的字符串可能会变大,影响执行时间。

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