Drools 6引入了新的惰性匹配算法。 该算法的详细信息已在之前的两个博客中介绍:
- RIP RETE时间获得PHREAKY
- 基于PHREAK堆栈的评估和向后链接
第一篇文章讨论了性能以及为什么算法的批处理和惰性方面难以比较。
“性能的最后一点。 通常,使用PHREAK的单个规则不会比使用RETE更快。 对于使用根上下文对象启用和禁用匹配的给定规则和相同数据集,它们都尝试相同数量的匹配并产生相同数量的规则实例,并且花费的时间大致相同。 除了带有子网的用例和积累。
但是,对于规则编写得不好的规则库,PHREAK可以认为比RETE更宽容,并且随着规则数量和复杂性的增加,性能会更适度地下降。
RETE还将为不包含所有联接的数据的规则生产部分机器。 PHREAK会避免这种情况。
因此,并不是PHREAK比RETE更快,它不会随着系统的增长而降低速度!”
最近,OptaPlanner团队开始对ReteOO和Phreak之间的同一组规则进行基准测试: 哪种规则引擎算法更快:ReteOO还是Phreak?
他们发现,三项测试的速度提高了20%,一项测试的速度降低了4%。 用户对该文章发表了评论,其性能差异为17%。
OptaPlanner团队投入了很多时间来确保编写规则的方式不会碰到Rete墙。 他们消除了许多问题,例如在一条规则中进行多次累加。
一个用户对如果您以已知的方式导致ReteOO出现问题而实施规则会感兴趣,那么它将更优雅地处理它。 他们创建了4条规则,每条规则都有两个累加。 您可以在此处找到DRL文件,其中一个规则的副本如下所示:
rule gold_account
whenaccount: Account()Number(this >= 50000) from accumulate(t: Transaction(source == account); sum(t.amount))Number(this >= 50000) from accumulate(t: Transaction(target == account); sum(t.amount))
then//System.out.println("Gold account: " + account);
end
结果令人鼓舞,Phreak的性能提高了400%(5倍):)这主要是因为Phreak可以分批评估规则,从而避免了很多浪费的工作。 它肯定表明我们已经实现了上一段中引用的目标之一:
“不过,PHREAK可以认为RETE对于编写得不好的规则库比RETE更为宽容,并且随着规则数量和复杂性的增加,性能会更加适度地下降。”
- 如果您想自己尝试一下,可以在这里签出项目: https : //github.com/winklerm/phreak-examples
到目前为止,该算法是为正确性而设计的,尤其是在线程安全性和将来的多核开发方面。 因此,这仅仅是开始,我们还有很多优化和改进要做。
翻译自: https://www.javacodegeeks.com/2014/02/drools-6-performance-with-the-phreak-algorithm.html