为什么我们在' =='中指定变量的顺序如何?比较问题?

时间:2017-04-07 16:07:34

标签: drools

我注意到,只需更改与' =='相比较的变量的顺序,就会有很大的性能差异。运营商。例如$ variable == variable比variable == $ variable慢得多。 为什么会这样,并且有类似这样的案例?

顺便说一句,我使用的是从GitHub下载的GitHub的OptaPlanner版本,该版本使用" 7.0.0-SNAPSHOT" Drools版本。

在所有执行交叉产品的规则中就是这种情况,我尝试将一个模式中的变量与另一个模式中的变量进行匹配。例如:

rule "Example"
   when
       Class1(... , $var : var)
       Class2($var == var, ...)
   then
end

所以,当我将表达式$ var == var更改为var == $ var时,我可以发现差异。

当谈到基准测试时,我只是在我关注的一个规则中比较了这个,所以我只在那里的表达式中进行了这种类型的更改(其他规则被删除)。 之后我将其应用于所有规则。

1 个答案:

答案 0 :(得分:3)

我认为会发生什么

Class1(... , $var : var)
Class2(var == $var, ...)

生成一个网络,其中包含所有Class1事实,然后创建具有相同var字段的所有Class2事实的笛卡尔积。

相比之下,

Class1(... , $var : var)
Class2($var == var, ...)

"重写"由编译器

Class1(... , $var : var)
$c2: Class2(...)
eval( $var == $c2.var )

创建所有Class1事实和所有(!)Class2事实的笛卡尔积,然后仅对eval为false的所有事件进行过滤。

传统语法(Drools 5及更早版本)强迫您在左侧使用字段名称;只有在晚些时候(5.x,6.x),才允许使用任何逻辑表达式。

与s.o说话后来自Drools团队的更准确的描述可能是这样的: - 可能会将属性与其他内容进行比较,从而触发优化。来自Drools团队的人会看一看并通过检查反向表达来改进它。