java正则匹配性能,Java正则表达式的性能问题

在编写EJB-QL的解析器的时候偶然发现的。

假设要解析的EJB-QL的值为:

SELECT OBJECT(al) FROM AppLibraryConfig al WHERE al.id=?1 AND al.status=true

下面看看不同的表达式Pattern所需要的执行时间,解析的伪代码为:

long start=System.currentTimeMillis();

Pattern pattern = Pattern.compile(getPatternText(), Pattern.CASE_INSENSITIVE);

Matcher matcher = pattern.matcher(query);

if (matcher.matches()) {

int groupCount = matcher.groupCount();

for (int i = 0; i <= groupCount; i++)

{

System.out.println("Group " + i + " :[" + matcher.group(i) + "]");

}

}

System.out.println(System.currentTimeMillis()-start);

现在看看不同的getPatternText()的值得到的不同结果。

1、性能最好的:

SELECT\\s+(DISTINCT)?\\s*OBJECT\\s*\\(\\s*(\\w+)\\s*\\)\\s+FROM\\s+\\w+(?:\\s+AS)?\\s+\\2\\s*

WHERE\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

(?:AND\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

这个的执行时间为0

2、修改一下,把最后的那个*修改为?:

SELECT\\s+(DISTINCT)?\\s*OBJECT\\s*\\(\\s*(\\w+)\\s*\\)\\s+FROM\\s+\\w+(?:\\s+AS)?\\s+\\2\\s*

WHERE\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

(?:AND\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

这个的执行时间为15毫秒

3、加长,把后面的AND部分复制一遍:

SELECT\\s+(DISTINCT)?\\s*OBJECT\\s*\\(\\s*(\\w+)\\s*\\)\\s+FROM\\s+\\w+(?:\\s+AS)?\\s+\\2\\s*

WHERE\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

(?:AND\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

(?:AND\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

这个的执行时间为31毫秒

4、继续加长,把后面的AND部分复制一遍:

SELECT\\s+(DISTINCT)?\\s*OBJECT\\s*\\(\\s*(\\w+)\\s*\\)\\s+FROM\\s+\\w+(?:\\s+AS)?\\s+\\2\\s*

WHERE\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

(?:AND\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

(?:AND\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

(?:AND\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

这个的执行时间为656毫秒

5、继续加长,把后面的AND部分复制一遍:

SELECT\\s+(DISTINCT)?\\s*OBJECT\\s*\\(\\s*(\\w+)\\s*\\)\\s+FROM\\s+\\w+(?:\\s+AS)?\\s+\\2\\s*

WHERE\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

(?:AND\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

(?:AND\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

(?:AND\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

(?:AND\\s+(\\2\\.\\w+)\\s*(=|is|<>|>=|>|

这个的执行时间为18547毫秒

看到问题了吧。表达式长了以后,这个性能的损害非常非常的大。

其实第一个表达式的匹配范围比最后一个更好,但是问题是,通过matcher.group()得到的是最后一次匹配的,现在还不知道如何解决,但是肯定可以解决。找到方法后再更新这个。

(Visited 470 times, 1 visits today)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值