1、问题
在浏览项目时,发现一段使用正则表达式的代码
这段代码,在循环里执行了Pattern.matches()方法进行正则匹配判断。
查看matches方法的源码,可以看到
每调用一次matches方法,都会创建一个Pattern对象,而且这段代码还是在for循环里,如果外层函数又被频繁调用,就会出现很明显的性能问题。
创建Pattern实例的成本很高,因为需要将正则表达式编译成一个有限状态机(final state machine)。
2、解决
使用正则表达式的预编译功能,可以有效加快正则匹配速度
显式地将正则表达式编译成一个不可变的Pattern实例,让它成为类初始化的一部分
private static final Pattern TASKID_PATTERN = Pattern.compile("^\d{1,15}");
最后在函数中使用如下方式调用,就可以避免创建不必要的Pattern实例
3、总结
正则表达式给人的印象是快捷简便。但是在 N.O.P.E 分支中使用正则表达式将是最糟糕的决定。如果万不得已非要在计算密集型代码中使用正则表达式的话,至少要将 Pattern 缓存下来,避免反复编译Pattern
创建Pattern实例的成本很高,因为需要将正则表达式编译成一个有限状态机(final state machine)
显式地将正则表达式编译成一个不可变的Pattern实例,让它成为类初始化的一部分。
【不建议】
// 没有使用预编译
private void func(...) {
if (Pattern.matches(regexRule, content)) {
...
}
}
// 多次预编译
private void func(...) {
Pattern pattern = Pattern.compile(regexRule);
Matcher m = pattern.matcher(content);
if (m.matches()) {
...
}
}
【建议】
private static final Pattern pattern = Pattern.compile(regexRule);
private void func(...) {
Matcher m = pattern.matcher(content);
if (m.matches()) {
...
}
}
作者:EmindCC