为什么我们在“==”比较中指定变量的顺序很重要?
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 团队的某个人会查看并可能通过检查反向表达式来改进它。
我注意到,仅通过更改与“==”运算符进行比较的变量的顺序,性能就会有很大差异。例如 $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 团队的某个人会查看并可能通过检查反向表达式来改进它。