2016-04-25 46 views
0

我想根據規則的數量和規則的複雜性來衡量流口水的性能。因此,我需要測量處理事件所需的時間。我想寫一個簡單的測試是這樣的:Drools融合:衡量性能

long start = System.currentTimeMillis(); 
for (int i = 0; i < 1000; i++) { 
    insertHeartRate(150, 0, macAddress); 
    ksession.fireAllRules(); 
} 
long stop = System.currentTimeMillis(); 
System.out.println("Running time: " + (stop - start)); 

我面臨的問題是,這並不工作,因爲你可以插入你想多 事件和後來的Drools也可以進行處理。所以這個 部分的時間總是少於一秒。所以我的問題是,如何處理所有事件後,我如何 請致電long stop = System.currentTimeMillis()

回答

1

fireAllRules發生所有事情後返回。因此,您發佈的代碼實際上會測量插入這些事件所用的時間,以及觸發所有觸發的規則。

如果您的規則啓動任何稍後執行的計時器:這是另一回事。另外,您正在處理Fusion:這些事件不會按照嚴格的循環,時間戳和窗口來到達:時間和臨時操作符:沒有任何操作符合規則中的預期。

如果沒有臨時操作符或window:time,則可以先測量插入事實所需的時間,然後測量fireAllRules的持續時間。

所有高度依賴於Java的JIT,GC的行爲和你的CPU的一些細節......

編輯看着你的代碼,我可以添加其他的建議後。確保您有順序的事件包圍插入和規則執行。運行一切 - 一次或多次插入和fireAllRules - 在一個線程中測量前後的時間。或者,在一個線程中運行fireUntilHalt,測量時間並插入另一個線程。現在,爲了查看在最後一次插入後什麼時候一切都已經停止,你必須構建一些東西來捕捉那一刻。一種方法是插入一些特殊的事實,觸發一個顯着性非常低的規則,並測量其後果的結束時間。

+0

我正在使用窗口:時間。我對Esper(另一個cep引擎)也是這樣做的,即使我也使用win:time,這個循環也可以工作。想到的一個解決方案是在所有其他觸發特定規則的事件之後插入事件,並在此規則觸發時執行'long stop = System.currentTimeMillis();'。但我寧願避免這種情況,是否有另一種方式? – Tim

+1

從fireAllRules返回後不應該發生任何事情。 – laune

+0

奧克,但我應該如何衡量執行時間,當有窗口的規則:時間?何時執行fireAllRules需要很長時間才能處理所有事件。這是我想要衡量的。我怎樣才能做到這一點? – Tim