Drools 为什么我们在'==';比较重要吗?

Drools 为什么我们在'==';比较重要吗?,drools,Drools,我注意到,通过改变与“==”运算符比较的变量的顺序,会有很大的性能差异。例如,$variable==variable比variable==variable慢得多。 为什么会这样?有类似的案例吗 顺便说一下,我使用的是从GitHub下载的一个版本的OptaPlanner,它使用的是“7.0.0-SNAPSHOT”Drools版本 在所有做叉积的规则中都是这样,我尝试将一种模式中的变量与另一种模式中的变量进行匹配。例如: rule "Example" when Class1(..

我注意到,通过改变与“==”运算符比较的变量的顺序,会有很大的性能差异。例如,$variable==variable比variable==variable慢得多。 为什么会这样?有类似的案例吗

顺便说一下,我使用的是从GitHub下载的一个版本的OptaPlanner,它使用的是“7.0.0-SNAPSHOT”Drools版本

在所有做叉积的规则中都是这样,我尝试将一种模式中的变量与另一种模式中的变量进行匹配。例如:

rule "Example"
   when
       Class1(... , $var : var)
       Class2($var == var, ...)
   then
end
因此,当我将表达式$var==var更改为var==var时,我可以立即发现差异

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

我认为发生的是

Class1(... , $var : var)
Class2(var == $var, ...)
生成一个网络,在该网络中获取所有Class1事实,然后创建笛卡尔积,其中所有Class2事实具有相同的
var
字段

相比之下

Class1(... , $var : var)
Class2($var == var, ...)
由编译器“重写”为

Class1(... , $var : var)
$c2: Class2(...)
eval( $var == $c2.var )
创建所有1类事实和所有(!)2类事实的笛卡尔乘积,然后过滤所有eval为false的情况

传统语法(Drools 5和更早版本)强制将字段名放在左侧;直到后来(5.x,6.x),才允许使用任何逻辑表达式


在与Drools团队的s.o.交谈后,更准确的描述可能是:-很可能在将属性与其他属性进行比较的地方触发优化。Drools团队的人员将进行检查,并可能通过检查反向表达式进行改进。

这可能取决于Drools的版本:它是哪一个?此外,还有规则和类的代码,用于演示效果,以及您如何对其进行基准测试。我编辑了这个问题,其中解释了我使用的Drools版本、规则中出现的情况以及我是如何进行基准测试的。感谢您分享这个问题,Jordan。没问题,杰弗里,如果这样的问题被发现并得到解决,我会非常高兴。谢谢你,你的解释真的很有帮助。我们创建了一个问题来调查,无论规则是如何编写的。