使用PHREAK算法实现Drools 6性能

本文探讨了Drools 6引入的PHREAK算法,相较于RETE算法,它在某些情况下能提供更好的性能。尽管单个规则的性能可能相似,但PHREAK在处理规则库增加和复杂性提升时,性能下降更为适度。OptaPlanner团队的基准测试显示,PHREAK在某些测试中速度提高了20%,甚至在特定案例中提升了400%。文章还提供了示例DRL文件和项目链接,供读者自行体验PHREAK的优势。
摘要由CSDN通过智能技术生成

Drools 6引入了新的惰性匹配算法。 该算法的详细信息已在之前的两个博客中介绍:

第一篇文章讨论了性能以及为什么算法的批处理和惰性方面难以比较。

“性能的最后一点。 通常,使用PHREAK的单个规则不会比使用RETE更快。 对于使用根上下文对象启用和禁用匹配的给定规则和相同数据集,它们都尝试相同数量的匹配并产生相同数量的规则实例,并且花费的时间大致相同。 除了带有子网的用例和积累。

但是,对于规则编写得不好的规则库,PHREAK可以认为比RETE更宽容,并且随着规则数量和复杂性的增加,性能会更适度地下降。

RETE还将为不包含所有联接的数据的规则生产部分机器。 PHREAK会避免这种情况。

因此,并不是PHREAK比RETE更快,它不会随着系统的增长而降低速度!”

最近,OptaPlanner团队开始对ReteOO和Phreak之间的同一组规则进行基准测试: 哪种规则引擎算法更快:ReteOO还是Phreak?

他们发现,三项测试的速度提高了20%,一项测试的速度降低了4%。 用户对该文章发表了评论,其性能差异为17%。

phreakperf

OptaPlanner团队投入了很多时间来确保编写规则的方式不会碰到Rete墙。 他们消除了许多问题,例如在一条规则中进行多次累加。

一个用户对如果您以已知的方式导致ReteOO出现问题而实施规则会感兴趣,那么它将更优雅地处理它。 他们创建了4条规则,每条规则都有两个累加。 您可以在此处找到DRL文件,其中一个规则的副本如下所示:

rule gold_account
when
  account: 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更为宽容,并且随着规则数量和复杂性的增加,性能会更加适度地下降。”

到目前为止,该算法是为正确性而设计的,尤其是在线程安全性和将来的多核开发方面。 因此,这仅仅是开始,我们还有很多优化和改进要做。

参考: Drools &jBPM博客上我们JCG合作伙伴 Geoffrey De Smet 的PHREAK算法带来的Drools 6性能

翻译自: https://www.javacodegeeks.com/2014/02/drools-6-performance-with-the-phreak-algorithm.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值