Drools Fusion:衡量性能

Drools Fusion: measure performance

我想根据规则的数量和规则的复杂程度来衡量流口水的性能。因此,我需要衡量处理事件所需的时间。我想写一个像这样的简单测试:

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));

我面临的问题是这不起作用,因为您可以插入尽可能多的 您想要的事件和流口水将在以后处理它们。所以这个时机 显然,部分总是少于一秒钟。所以我的问题是我怎样才能 在处理完所有事件后调用 long stop = System.currentTimeMillis()

fireAllRulesreturns一切都发生之后。因此,您发布的代码确实会测量插入这些事件以及触发所有触发规则所用的时间。

如果您的规则启动任何稍后将执行的计时器:那是另一回事。此外,您正在解决 Fusion 问题:这些事件将不会根据紧密循环、时间戳和 window:time 以及时间运算符到达:任何事情都不会像您的规则中预期的那样工作。

如果没有时间运算符,或者window:time,您可以测量首先插入事实所花费的时间,并测量fireAllRules的持续时间。

一切都高度依赖于 Java 的 JIT、GC 行为和您的 CPU...

的一些细节

编辑 查看您的代码后,我可以添加另一个建议。确保您有一个连续的事件序列,包括插入和规则执行。 运行 一切 - 一次或重复插入和 fireAllRules - 在一个线程中并测量前后的时间。或者,运行 在一个线程中使用 fireUntilHalt,测量时间并在另一个线程中插入。现在,要查看在最后一次插入后一切何时消失,您必须构建一些东西来捕捉那一刻。一种方法是插入一些特殊的事实,触发显着性很低的规则,并衡量其结果的结束时间。