正则表达式的优化
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
引用,并且您没有在任何地方分配它。编译器可能只是优化这部分并丢弃这个循环。底线是结果与第一个示例返回的结果不同。
我正在使用 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
引用,并且您没有在任何地方分配它。编译器可能只是优化这部分并丢弃这个循环。底线是结果与第一个示例返回的结果不同。