使用PHREAK算法实现Drools 6性能
Drools 6引入了新的惰性匹配算法。 該算法的詳細(xì)信息已在之前的兩個(gè)博客中介紹:
- RIP RETE時(shí)間獲得PHREAKY
- 基于PHREAK堆棧的評(píng)估和向后鏈接
第一篇文章討論了性能以及為什么算法的批處理和惰性方面難以比較。
“性能的最后一點(diǎn)。 通常,使用PHREAK的單個(gè)規(guī)則不會(huì)比使用RETE更快。 對(duì)于使用根上下文對(duì)象啟用和禁用匹配的給定規(guī)則和相同數(shù)據(jù)集,它們都嘗試相同數(shù)量的匹配并產(chǎn)生相同數(shù)量的規(guī)則實(shí)例,并且花費(fèi)的時(shí)間大致相同。 除了帶有子網(wǎng)的用例和積累。
但是,對(duì)于規(guī)則編寫得不好的規(guī)則庫(kù),PHREAK可以認(rèn)為比RETE更寬容,并且隨著規(guī)則數(shù)量和復(fù)雜性的增加,性能會(huì)更適度地下降。
RETE還將為不包含所有聯(lián)接的數(shù)據(jù)的規(guī)則生產(chǎn)部分機(jī)器。 PHREAK會(huì)避免這種情況。
因此,并不是PHREAK比RETE更快,它不會(huì)隨著系統(tǒng)的增長(zhǎng)而降低速度!”
最近,OptaPlanner團(tuán)隊(duì)開(kāi)始對(duì)ReteOO和Phreak之間的同一組規(guī)則進(jìn)行基準(zhǔn)測(cè)試: 哪種規(guī)則引擎算法更快:ReteOO還是Phreak?
他們發(fā)現(xiàn),三項(xiàng)測(cè)試的速度提高了20%,一項(xiàng)測(cè)試的速度降低了4%。 用戶對(duì)該文章發(fā)表了評(píng)論,其性能差異為17%。
OptaPlanner團(tuán)隊(duì)投入了很多時(shí)間來(lái)確保編寫規(guī)則的方式不會(huì)碰到Rete墻。 他們消除了許多問(wèn)題,例如在一條規(guī)則中進(jìn)行多次累加。
一個(gè)用戶對(duì)如果您以已知的方式導(dǎo)致ReteOO出現(xiàn)問(wèn)題而實(shí)施規(guī)則會(huì)感興趣,那么它將更優(yōu)雅地處理它。 他們創(chuàng)建了4條規(guī)則,每條規(guī)則都有兩個(gè)累加。 您可以在此處找到DRL文件,其中一個(gè)規(guī)則的副本如下所示:
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結(jié)果令人鼓舞,Phreak的性能提高了400%(5倍):)這主要是因?yàn)镻hreak可以分批評(píng)估規(guī)則,從而避免了很多浪費(fèi)的工作。 它肯定表明我們已經(jīng)實(shí)現(xiàn)了上一段中引用的目標(biāo)之一:
“不過(guò),PHREAK可以認(rèn)為RETE對(duì)于編寫得不好的規(guī)則庫(kù)比RETE更為寬容,并且隨著規(guī)則數(shù)量和復(fù)雜性的增加,性能會(huì)更加適度地下降。”
- 如果您想自己嘗試一下,可以在這里簽出項(xiàng)目: https : //github.com/winklerm/phreak-examples
到目前為止,該算法是為正確性而設(shè)計(jì)的,尤其是在線程安全性和將來(lái)的多核開(kāi)發(fā)方面。 因此,這僅僅是開(kāi)始,我們還有很多優(yōu)化和改進(jìn)要做。
翻譯自: https://www.javacodegeeks.com/2014/02/drools-6-performance-with-the-phreak-algorithm.html
總結(jié)
以上是生活随笔為你收集整理的使用PHREAK算法实现Drools 6性能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 越挫越勇是什么意思 越挫越勇解释
- 下一篇: Java 8 Friday Goodie