我们一直在寻求改善Drools DMN开源引擎的性能。 我们最近审查了DMN用例,其中输入数据节点的实际输入总体有所不同。 这突出显示了引擎的次佳性能,我们在最新版本中对此进行了改进。 我想分享我们的发现!

基准制定

当我们开始为该用例运行一个支持基准测试时,尤其是在调查具有稀疏填充的输入数据节点的大型DMN模型的场景时,我们注意到了一些奇怪的结果:火焰记录仪数据突出显示了记录消息时的性能严重下降,这非常消耗与应用逻辑本身相比,花费了大量时间。


该火焰图特别强调了测井框架人为地引起的堆栈跟踪合成消耗了大量时间。 在这种情况下,纠正措施是调整日志记录配置以避免此问题。 具体来说,我们禁用了日志记录框架的一项功能,该功能在调试活动期间非常方便,从而可以快速定位原始的调用类和方法:不幸的是,此功能的代价是合成堆栈跟踪,该跟踪最初污染了基准测试结果。 从这里学到的教训:请始终先检查非功能性需求是否真的掩盖了真正的问题!

在继续更详细地研究用例之前,这是必要且可行的步骤。

改善表现

继续并专注于DMN优化,我们专门开发了一个通用性很强的基准,同时也重点介绍了已提供给我们的用例。 该基准包含一个DMN模型,其中包含许多要评估的决策节点(500个)。 另一个参数控制输入数据节点的稀疏性以进行评估; 范围从值1(填充所有输入)到值2(仅填充两个输入中的一个),等等。

事实证明,该特定基准是突出一些潜在改进的非常有用的工具。

将比较基准设置为Drools 7.23.0版。最终,使用DROOLS-4204实现的第一个优化专注于在评估FEEL表达式的同时改善上下文处理,并证明可提供约3倍的改进,而使用DROOLS-4266进行的进一步优化则专注于特定决策表输入子句的用例表明,在DROOLS-4204的基础上,附加的〜2倍改进。

我们还在下图中收集了这些度量。


该图突出显示了当稀疏因子等于1时(填充所有输入时)的复合改进。 这是一个非常重要的结果,因为实际上它确实代表了原始用例中的主要 “快乐路径”场景。

换句话说,与在相同的用例上运行相比,我们实现了约6倍的改进

7.23.0。最终版 我在这里学到的教训是,在可能的情况下,始终努力争取这些复合的改进,因为它们确实可以彼此叠加,以获得更大的效果!

为了完整起见,我们使用以下度量重复分析,其稀疏因子等于2(实际上每2个输入填充1个)和50个(实际上每50个输入填充1个),并进行以下测量:


结果表明,对于等于2的稀疏因子,优化也很重要,但是随着该因子的增加,相关的改进并不明显-这是可以预期的,因为决策节点评估对整体执行逻辑的影响现在变得不那么重要了。

为了完整起见,还对包含多个规则行的单个决策表使用了另一个已经存在的基准进行分析:


结果表明,这些代码更改从整体上来看仍然可以提供相关的改进; 虽然显然不相同幅度为原来使用-情况。 这是另一项重要检查,以确保这些改进不适合特定用例。

结论

以Drools版本7.23.0.Final为基准,以及包含DMN模型和许多待评估决策节点的参考基准,我们实施了多项优化,这些优化一旦结合在一起,就可以使该特定项目的总速度提高约6倍用例!

我希望这是一篇有趣的文章,以强调要取得更好性能的一些方面; 让我们知道您的想法和反馈。

今天,您已经可以从Drools最新版本中的Kie DMN开源引擎改进中受益!

翻译自: https://www.javacodegeeks.com/2019/08/drools-dmn-performance-improvements.html

Drools DMN最新开源引擎性能改进相关推荐

  1. drools dmn_Drools DMN最新开源引擎性能改进

    drools dmn 我们一直在寻求改善Drools DMN开源引擎的性能. 我们最近审查了DMN用例,其中输入数据节点的实际输入总体有所不同. 这突出显示了引擎的次佳性能,我们在最新版本中对此进行了 ...

  2. .NET 5 中的正则引擎性能改进(翻译)

    前言 System.Text.RegularExpressions 命名空间已经在 .NET 中使用了多年,一直追溯到 .NET Framework 1.1.它在 .NET 实施本身的数百个位置中使用 ...

  3. 【翻译】.NET 5中的性能改进

    [翻译].NET 5中的性能改进 在.NET Core之前的版本中,其实已经在博客中介绍了在该版本中发现的重大性能改进. 从.NET Core 2.0到.NET Core 2.1到.NET Core ...

  4. OGEngine基于java支持跨平台的手游开发开源引擎

    OGEngine是国际著名开源引擎AndEngine的一个分支,遵循LGPL开源协议使用OpenGL ES进行图形绘制.同时集成了Box2D物理引擎,因此可以实现复杂的物理效果. OGEngine主要 ...

  5. HTTP/3: 性能改进(第2部分)

    原文链接:https://www.smashingmagazine.com/2021/08/http3-performance-improvements-part2/ 作者亲自操刀的系列文章,英文的, ...

  6. 滴滴如何基于开源引擎,打造自主可控服务体系

    本文作者:张亮 滴滴云-商业数据 负责人 2014年加入滴滴,负责过LogAgent.Kafka.ElasticSearch.OLAP的引擎建设工作,具有丰富的高并发.高吞吐场景的架构设计与研发经验, ...

  7. 最新开源的目标检测算法来了!

    Datawhale开源 方向:目标检测开源项目 说到目标检测,那可谓当前的自动驾驶.新零售.智慧工业等热门行业中的关键技术之一.目标检测不仅在行人.车辆.商品以及火灾检测等任务中发挥着极其关键的价值, ...

  8. php推荐引擎算法,推荐系统,第 2 部分: 开源引擎简介

    问题导读: 1.简单的推荐生态系统是怎么样的? 2.常见的推荐算法有哪些? 3.怎么用restful服务构建推荐系统? 上一篇: 推荐系统,第 1 部分: 方法和算法简介 http://www.abo ...

  9. 6个你应该用用看的用于文本分类的最新开源预训练模型 忆臻

    作者:PURVA HUILGOL 编译:ronghuaiyang (AI公园) 原文链接: 6个你应该用用看的用于文本分类的最新开源预训练模型​mp.weixin.qq.com 导读 文本分类是NLP ...

最新文章

  1. linux刷新挂载信息,Linux系统下如何挂载FAT32的U盘
  2. Oracle 基础教程
  3. 存储基础知识 - 磁盘寻址(CHS寻址方式、LBA寻址方式)
  4. maximo 工作流实现代码
  5. Java设计模式(一) -- 工厂方法模式
  6. leetcode- Sqrt(x)
  7. LeetCode 568. 最大休假天数(DP)
  8. tableView的用法具体解释
  9. Web前端:javascript实现图片轮播
  10. android 禁用home键
  11. CSS改变simditor代码区间的默认显示样式和自动换行
  12. [语义分割]CTNet: Context-based Tandem Network for Semantic Segmentation
  13. 转:高手速成android开源项目【View篇】 .
  14. 【风马一族_构思】时光穿梭机
  15. 成功解决Windows和VM下的Ubuntu虚拟系统之间相互复制粘贴的问题
  16. root过的手机保修吗,root过的手机保修吗苹果
  17. Github 配置SSH keys教程
  18. IpadOS15.4系统通用控制开启
  19. 软件测试实验——编写测试用例
  20. 关于基于Linux的电子词典的编写

热门文章

  1. P6477-[NOI Online #2 提高组]子序列问题【线段树】
  2. nssl1320,jzoj(初中)2108-买装备【dfs,水题】
  3. NOIP2018-普及总结
  4. NOIP2013货车运输
  5. L3-002 堆栈 树状数组+二分答案
  6. Oracle入门(十四.21)之创建DML触发器:第二部分
  7. 漫画算法:判断2的乘方
  8. JSON.toJSONString
  9. javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——测试
  10. javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——applicationContext.xml