我在Java项目中遇到了一个与正则表达式匹配有关的性能问题,这导致了CPU使用率很高。尽管我尝试了正则表达式优化,但我仍然遇到性能问题,特别是当多个线程并发调用代码时。
例如,当调用一个并行执行正则表达式匹配100次的方法时,CPU使用率在一段短时间内达到90%。
下面是我代码的一个简化示例:
String BUY_PATTERN =".*\\b(purchase)\\b.*";
private static boolean isMatchPattern(String pattern, String text) {
return text.matches(BUY_PATTERN);
}
我想减少正则表达式匹配期间的CPU使用。您能否提供一些建议,以实现相同功能的更高效正则表达式模式?
此外,我偶然看到一篇文章(link provided),讨论回溯对性能的影响,但我发现重写正则表达式以最小化回溯是一个挑战。
感谢您的帮助!
1条答案
按热度按时间u5rb5r591#
你可以做一些改变。
您可以通过创建可重用的对象来大大减少CPU消耗。
在后台,每次调用
String.matches
时,都会创建一个新的Pattern
和Matcher
对象。为了解决这个问题,您可以在类中创建
Pattern
和Matcher
字段。然后,从
isMatchPattern
方法中访问这些字段。此外,对于正则表达式模式,不需要捕获文本“purchase”,因此可以删除括号。
此外,
Pattern
模式的上下文是不一致的;它应该在文本中的任何地方。与
String.matches
调用相反,它需要整个参数匹配。因此,您不需要开始和结束
.*
,因为它们是冗余的。关于使用
String.indexOf
或String.contains
。如果您需要进行单词边界检查,那么从惯用方法的Angular 来看,这是不可能的,因为您必须进行多个调用。
如果你不需要检查,那么这将是一条路要走。
作为最终的解决方案,您可以创建一个字符数组for循环,这或多或少是
Matcher
类所做的。