为什么我们在“==”比较中指定变量的顺序很重要?

Why does the order of how we specify the variables in a '==' comparison matter?

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

顺便说一下,我使用的是 GitHub 的 OptaPlanner 版本,它是从 GitHub 下载的,它使用“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 事实,然后创建具有相同 var 字段的所有 Class2 事实的笛卡尔积。

相比之下,

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

"rewritten" 由编译器作为

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

创建所有 Class1 事实和所有 (!) Class2 事实的笛卡尔积,然后才过滤所有 eval 为假的地方。

传统语法(Drools 5 及更早版本)强制您将字段名称放在左侧;只是后来(晚 5.x、6.x),允许任何逻辑表达式。

与 s.o 交谈后。来自 Drools 团队的更准确的描述可能是这样的:- 很可能在将属性与其他属性进行比较时触发优化。 Drools 团队的某个人会查看并可能通过检查反向表达式来改进它。