我正在使用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%以下。
答案 0 :(得分:1)
我认为以下一行:String.format(format, args);
是原因。
在第一个示例中,您在替换字符之前执行它,在第二个示例中,您执行此操作。根据{{1}}变量,处理后的字符串在第一个示例中可能会变得更大,从而影响执行时间。
此外,在第二个示例中,循环没有做任何有用的事情 - format
创建新的replaceAll
引用,并且您没有在任何地方分配它。编译器可能只是优化此部分并抛弃此循环。底线是结果与第一个例子返回的结果不同。