Drools Salience 对性能有影响吗?

Does Drools Salience Have Performance Impacts?

例如,如果我有 100 万个事实对象,通过一组规则,其中规则的执行顺序无关紧要。两者之间会有任何性能差异吗:

  1. 为每个规则明确分配不同的显着性值
  2. 使用默认的显着性值(0)还是所有规则都具有相同的显着性值?

纯属好奇,因为刚听说后者性能更好


我自己做了一些基准测试。结果表明,不同的显着性方法确实有一些开销,并且增加了总处理时间(虽然不多),但是事实对象处理所花费的时间似乎是一样的。

不确定这个观察是否符合底层代码逻辑。

谢谢两位的详细解释

议程,即包含所有规则激活的列表,按显着性排序。很明显,维护按某种标准排序的链表比无序链表的成本更高。当然,实现尽量高效,见代码org.drools.core.util.BinaryHeapQueue.

对每条规则使用不同的显着性是最坏情况的一个组成部分。另一个是插入和触发的交错,这可能会使不同的显着性值有害或产生不良或最坏的情况。

对于 Drools 6。将给定规则的每个规则匹配(也称为激活或规则实例化)添加到双向链表中。触发该规则是迭代该列表的问题,依次触发每个规则。

每个要评估的规则都放在 BinaryHeapQueue 上,规则依次弹出、评估、生成链表,然后迭代以尝试触发。

如果每个规则有大量的规则匹配,那么堆队列的成本将不会很明显。如果每个规则的规则匹配数量很少,但规则数量很多,相比之下,您可能会看到 10%(这是一个猜测)左右的开销。