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 がそれらを処理するため、これが機能しないことです。したがって、この部分のタイミングは常に 1 秒未満です。だから私の質問はlong stop = System.currentTimeMillis()、すべてのイベントが処理された後にどのように呼び出すことができますか?

4

1 に答える 1

2

fireAllRulesすべてが起こった後に戻ります。したがって、投稿したコードは実際に、これらのイベントを挿入し、トリガーされたすべてのルールを起動するまでの経過時間を測定します。

ルールが後で実行されるタイマーを開始する場合、それは別の問題です。また、Fusion に対処しています: これらのイベントはタイトなループに従って到着せず、タイムスタンプと window:time および一時的な演算子: ルールで期待どおりに機能しません。

時間演算子または window:time がない場合は、最初にファクトを挿入するのにかかる時間を測定し、fireAllRules の期間を測定できます。

すべては、Java の JIT、GC の動作、および CPU の詳細に大きく依存しています...

編集コードを確認した後、別の推奨事項を追加できます。挿入とルールの実行をまとめた一連のイベントがあることを確認してください。すべて (insert と fireAllRules) を 1 回または繰り返して 1 つのスレッドで実行し、前後の時間を測定します。または、1 つのスレッドで fireUntilHalt を実行し、時間を測定して別のスレッドに挿入します。ここで、最後の挿入後にすべてがいつ停止したかを確認するには、その瞬間を捉えるために何かを作成する必要があります。1 つの方法は、特別な事実を挿入して、重要度が非常に低いルールをトリガーし、その結果の終了時間を測定することです。

于 2016-04-25T18:36:35.837 に答える