我注意到,仅更改与“==”运算符进行比较的变量的顺序就会产生很大的性能差异。例如,$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, ...)
生成一个网络,其中所有 1 类事实均被采用,然后与所有 2 类事实具有相同的笛卡尔积var
字段已创建。
相比之下,
Class1(... , $var : var)
Class2($var == var, ...)
被编译器“重写”为
Class1(... , $var : var)
$c2: Class2(...)
eval( $var == $c2.var )
创建所有 1 类事实和所有(!)2 类事实的笛卡尔积,然后过滤所有 eval 为假的地方。
传统语法(Drools 5 及更早版本)强制将字段名称放在左侧;直到后来(5.x、6.x 后期),才允许任何逻辑表达式。
与 S.O. 交谈后根据 Drools 团队的说法,更准确的描述可能是这样的:- 当某个属性与其他属性进行比较时,很可能会触发优化。 Drools 团队的人员会查看并可能通过检查反转的表达式来改进它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)