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

2023-11-30

我注意到,仅更改与“==”运算符进行比较的变量的顺序就会产生很大的性能差异。例如,$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(使用前将#替换为@)

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

  • 规则引擎Drools使用 第十四篇 Spring整合Drools

    使用Spring管理整合drools 首先需要引入依赖 然后配置spring文件 引入依赖
  • 规则引擎Drools使用 第十一篇 Drools 的高级语法之LHS增强

    前面我们已经知道了在规则体中的LHS部分是介于when和then之间的部分 主要用于模式匹配 只有匹配结果为true时 才会触发RHS部分的执行 下面我们会针对LHS部分学习几个新的用法 目录 复合值限制in not in 条件元素eval
  • 规则引擎Drools使用 第二篇Drools规则引擎介绍

    Drools规则引擎介绍 drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎 可以将复杂且多变的业务规则从硬编码中解放出来 以规则脚本的形式存放在文件或特定的存储介质中 例如存放在数据库中 使得业务规则的变更不需要修
  • 如何通过 ant 构建脚本编译 .drl 文件

    我是流口水的新手 我想知道是否可以使用某种可以在 Windows 命令行 shell cmd 中输入的命令来编译 drl 文件 我查看了 drools 发行版附带的二进制文件 但我无法找到编译 drl 文件的方法 我对这样的命令感兴趣的原因
  • 为什么我们在“==”比较中指定变量的顺序很重要?

    我注意到 仅更改与 运算符进行比较的变量的顺序就会产生很大的性能差异 例如 variable variable 比variable variable 慢得多 为什么会这样 有类似的案例吗 顺便说一下 我使用的是从 GitHub 下载的 Op
  • 流口水基于时间的限制和“现在”

    我们正在尝试写一个流口水 上面写着 如果事件发生在上周 则执行后果 我们有表示事件发生时间的常规 java 日期对象 但我们不确定如何在流口水的 LHS 中表达我们希望该日期对象在上周发生 重要的是 一周的时间跨度是任意的 它可以随时更改为
  • 方言错误消息流口水

    我已经在 Tomcat 7 中部署了一个 webApp 我正在使用 Drools 现在 当我连续运行时 Drools 会抛出运行时异常 我也在类路径中添加了 core 3 4 2 v 883 R34x jar 请查找错误日志 Some er
  • Drools 6.4 KieScanner:如何在 Maven 中创建和添加带有规则的 Jar?

    我是 Drools 和 Maven 的初学者 我面临着使用 KieScanner 加载规则的问题 该项目的目标是能够在永久 KieSession 中动态加载规则 我想知道是否可以使用 KieFileSystem 管理规则 不确定是否可以在不
  • 将新规则文件添加到现有知识会话

    我想向现有的规则文件添加一个新的规则文件 或修改现有的规则文件 KieSession在运行时动态地 我找到了一个answer https stackoverflow com a 22208775 1925388关于这一点并尝试了那里提到的解
  • 流口水中的更新功能如何工作?

    流口水中的更新功能如何工作 它是否会导致相同的规则自动再次触发 我认为你需要阅读手册 http docs jboss org drools release 5 4 0 Final drools expert docs html single
  • Drools:在数据库中存储规则

    目前 我将所有规则文件存储在文件系统上 它们有很多版本 并在启动时将它们的不同版本加载到内存中 我想更改为将我的 drools 文件存储在数据库中 并且想知道 Drools 是否有任何解决方案或插件可以促进这一点 或者我应该自己制作 Tha
  • JESS 与 DROOLS :向后链接

    我正在尝试用 Drools 替换 Jess 作为我们项目中的向后链接规则引擎 我一直在寻找有关如何使用 Drools 完成反向链接的简单示例 有趣的是 只有 1 个相同example http www slideshare net Mark
  • Drools 中类型不安全的对象字段访问

    我正在使用一个系统 其中插入 Drools 引擎的一些数据遵循以下 严重过度简化 格式 public class Item public String getValueType public Object getValue 这些值可能有几种
  • Spring-Drools 集成:引用的文件 (kie-spring.xsd) 包含错误

    我正在尝试将 drools 与 Spring 一起使用 春季版本4 01 Drools Kie 版本 6 0 1 我的 kie context xml 有以下错误 在 Eclipse 中 引用的文件包含错误 http drools org
  • 规则引擎Drools的入门使用

    pom 依赖
  • Guvnor规则编码

    我在 Excel 中有一个 Drools 决策表 规则中使用的一些字符串具有 字符 当我从这个决策表在 Guvnor 中构建规则包时 我在规则源中得到了错误的字符 例如 在电子表格中 gt rea de Lazer POR 在内置的 drl
  • 从 Drools 6 中的数据库加载和更新规则

    如何在启动时从数据库表加载规则并从 Drools 6 2 0 中的同一个表更新它们 我找到了一个example http sujitpal blogspot com 2013 03 jboss rules in database take
  • 如何从 Drools 列表中获取最大最小项目

    我有课 class Person public Date dateOfBirth public List
  • drools 中是否有任何 API 可以通过传递值来动态创建 drl 文件?

    我知道如何使用所有方法在 KIE 工作台中创建 DRL 文件 但我的问题是不使用 KIE 工作台 我们可以创建 drl使用我们所需的值进行文件 如果有任何可能性 请建议我 同样的方式建议我任何与此相关的 API 提前致谢 您可以使用Droo
  • 决策树和规则引擎 (Drools)

    In the application that I m working on right now I need to periodically check eligibility of tens of thousands of object

随机推荐