java - 将事实插入工作内存的时间根据规则库大小增加

标签 java drools rules rule-engine

我在我的系统中进行了一些评估实验,检查插入不同(规则数量)规则库所花费的时间和内存中的事实数量。注意:我没有使用持久性。 Drools 版本:6.3.0.Final。

表 - 规则库 (RB)、插入时间 (TTI)、以毫秒为单位的时间。 Rule base (RB) reading time, rule base size, and time to insert (TTI) facts in the working memory.

根据上面预设的表格,我想知道为什么随着规则库大小的增加,将事实包含在内存中的时间增加?

我不是 Drools 专家。

最佳答案

在给定的网络状态下,事实的插入、撤回和更新会导致条件的即时评估。这不仅仅是规则的数量;重要的是事实类型的引用数量。

您观察到的增加小于 O(N),N 是规则的数量,这与理论非常吻合。

12,000 条规则的数量非常多(除非您发明规则只是为了测试可扩展性)。如果它们是真实的,并且您担心性能,则应该修改规则结构。

根据 OP 的评论进行编辑

“事实类型的引用数”是特定类(= 类型)在模式中出现的次数。在你的例子中

rule x when
$spec1 : Specification ( )
$spec2 : Specification ( $spec1.id ==2, id == 3, value > $spec1.value )

rule "x+1" when
$spec1 : Specification ( )
$spec2 : Specification ( $spec1.id ==3, id == 4, value > $spec1.value )

您有 2 个规则,但有 4 个对 Specification 的引用。这势必会在 Engine 中创建一个更复杂的网络。此外,约束排他性地依赖于第一个模式中的数据($spec1.id ==X)但出现在第二个中 模式几乎可以肯定是一种反模式。

使用像这样的糟糕结构,几乎可以无限地降低 RBS 的速度,而不仅仅是 Drools。显然你确实只是在测试可扩展性。坚持写得很好的规则可能会给您带来更有说服力的结果。

关于java - 将事实插入工作内存的时间根据规则库大小增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35649249/

相关文章:

java - 背景资源边框顶部和底部

java - 如何配置 Drools 与 JBOSS 一起运行?

java - 使用 DROOLS 对项目进行分类

java - 免费/开源 Java 规则/工作流引擎

java - 使用架构注册表对 avro 消息进行 Spring 云合约测试

java - Jersey 异步下载 zip 文件

java - 如何从android中的谷歌应用引擎数据存储中获取数据

java - 如何在 Eclipse IDE 中调试 Drools 文件 (.drl)

c# - 如何在 .NET 中查找 windows 拨号规则

inheritance - Junit 规则、测试用例和继承 : Do they work together?