Java正则表达式匹配中的CPU使用优化

rkkpypqq  于 2023-05-27  发布在  Java
关注(0)|答案(1)|浏览(409)

我在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),讨论回溯对性能的影响,但我发现重写正则表达式以最小化回溯是一个挑战。
感谢您的帮助!

u5rb5r59

u5rb5r591#

你可以做一些改变。
您可以通过创建可重用的对象来大大减少CPU消耗。

public class Example {
    Pattern pattern = Pattern.compile("\\bpurchase\\b");
    Matcher matcher;

    private boolean isMatchPattern(String text) {
        matcher = pattern.matcher(text);
        return matcher.find();
    }
}

在后台,每次调用String.matches时,都会创建一个新的PatternMatcher对象。
为了解决这个问题,您可以在类中创建PatternMatcher字段。
然后,从isMatchPattern方法中访问这些字段。
此外,对于正则表达式模式,不需要捕获文本“purchase”,因此可以删除括号。
此外,Pattern模式的上下文是不一致的;它应该在文本中的任何地方。
String.matches调用相反,它需要整个参数匹配。
因此,您不需要开始和结束.*,因为它们是冗余的。
关于使用String.indexOfString.contains
如果您需要进行单词边界检查,那么从惯用方法的Angular 来看,这是不可能的,因为您必须进行多个调用。
如果你不需要检查,那么这将是一条路要走。
作为最终的解决方案,您可以创建一个字符数组for循环,这或多或少是Matcher类所做的。

相关问题