0

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

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()所以我的问题是在处理完所有事件后如何调用?

4

1 回答 1

2

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

如果您的规则启动任何稍后将执行的计时器:那是另一回事。此外,您正在解决 Fusion:这些事件不会根据紧密的循环到达,时间戳和 window:time 和时间运算符:没有任何东西可以按照您的规则预期工作。

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

一切都高度依赖于 Java 的 JIT、GC 行为和你的 CPU 的一些细节......

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

于 2016-04-25T18:36:35.837 回答