[英]How to match regular expression without creating objects in Java?
我正在研究reg表达式匹配功能。 问题是,该函数将由嵌套循环内的框架调用。 如果创建了临时对象,GC将导致很大的性能问题。
是否可以在不创建临时对象(Pattern,Matcher)的情况下处理正则表达式? 重写regexp类是我的最后选择。
最好的选择是在问题出现时及时处理-可能不会。 大约10年前,围绕GC处理大量小型活动对象的性能问题是一个问题,但现在已经非常出色了。
如果确实需要优化,则应采用更改GC选项的形式-例如,年轻一代的大小,而不要尝试在代码中进行优化。
Matcher
对象不是线程安全的,因此除非调用reset()
方法(在单个线程中应该可以正常工作),否则您将无法重用它们-请参见Java Regex线程安全吗?
引用一句老话:
使它起作用,使其正确,使其快速。 (以该顺序)
因此,在执行任何繁琐的优化步骤之前,只需编写初始的,简单易用的适当代码(在这种情况下,如果可能的话,将涉及预编译模式)。 运行一些测试,看看性能是否不足,然后优化正则表达式部分是否成为瓶颈。
如果对象的创建(和清除)是一个严重的瓶颈(与实际的正则表达式本身相比),那么您可能需要实现使用对象池的自己的解决方案(因此不创建对象,只需从对象中重置并重新使用)池)。 我怀疑这是否会导致任何严重的性能提升,因此您应该首先进行基准测试,以查看甚至有多少增益(如果将对象创建/清理性能提高50%,是否值得?)。
这听起来像过早的优化。
编写最简单的代码,然后在实际设置中对其进行分析,并查看性能或内存分配模式是否存在问题。 如果有,请解决您发现的特定问题。
现代JVM非常擅长于垃圾收集短期对象。
您可以预编译正则表达式,如果您多次重复使用同一个正则表达式,则很有用。
代替
boolean foundMatch = subjectString.matches("a.*b");
(无论如何都会创建一个临时的已编译Pattern
),您可以使用
Pattern regex = Pattern.compile("a.*b");
// loop here
// do something...
Matcher regexMatcher = regex.matcher(subjectString);
boolean foundMatch = regexMatcher.matches()
// loop end
不过,很难说是否会有任何相关的性能优势。
似乎您正在进行早期优化,对您而言,这很可能是无用的。 您如何进行测试并做出决定?
欢呼,尤金
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.