<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Matteo Mortari</title>
    <description>The latest articles on DEV Community by Matteo Mortari (@tarilabs).</description>
    <link>https://dev.to/tarilabs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F213444%2Fe586d294-30f2-4852-897b-7eb7605a6570.jpeg</url>
      <title>DEV Community: Matteo Mortari</title>
      <link>https://dev.to/tarilabs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tarilabs"/>
    <language>en</language>
    <item>
      <title>Functional Programming in DMN: it FEELs like recursing my university studies again</title>
      <dc:creator>Matteo Mortari</dc:creator>
      <pubDate>Tue, 14 Apr 2020 14:16:33 +0000</pubDate>
      <link>https://dev.to/tarilabs/functional-programming-in-dmn-it-feels-like-recursing-my-university-studies-again-58g1</link>
      <guid>https://dev.to/tarilabs/functional-programming-in-dmn-it-feels-like-recursing-my-university-studies-again-58g1</guid>
      <description>&lt;p&gt;In this post, I would like to share interesting insights about recursion support in DMN and highlights how specific properties of the FEEL language enable functional programming constructs to be modeled in DMN.&lt;/p&gt;

&lt;p&gt;We are going to start from a basic example, in order to demonstrate how the Business Friendliness nature of the FEEL language and DMN constructs, allow us to tame an otherwise commonly unpleasant problem: the definition of a recursive function. Then, we are going to adventure in FP land, and in the cradle of FEEL/DMN we will admire one of the best creatures of functional construct: the Y Combinator. At the end, we will find ourselves be asked the famous question again:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4OQlEaFG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/40sexu1a7fn9u5ed97mt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4OQlEaFG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/40sexu1a7fn9u5ed97mt.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using the pure engineering approach, let’s dig into the matter right away!&lt;/p&gt;
&lt;h1&gt;
  
  
  BASIC RECURSION EXAMPLE
&lt;/h1&gt;

&lt;p&gt;The &lt;a href="https://drools.org/learn/dmn.html"&gt;Drools DMN open source engine&lt;/a&gt; allows recursion support in DMN Business Knowledge Model nodes. This enables modeling of recursive functions very easily and &lt;strong&gt;it is our recommended approach&lt;/strong&gt; when modeling recursive functions in DMN: allow the function to call itself by its name.&lt;/p&gt;

&lt;p&gt;Let’s take a look at a simple example: modeling the &lt;a href="https://en.wikipedia.org/wiki/Factorial"&gt;factorial&lt;/a&gt; function in DMN.&lt;/p&gt;

&lt;p&gt;We can use the &lt;a href="https://porcelli.me/announcement/tooling/online/bpmn/dmn/2020/03/12/online-new-editors.html"&gt;Kogito DMN editor&lt;/a&gt; and define the DRD as follows:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--poec56ky--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wtbyjeryj99cpse6dh4w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--poec56ky--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wtbyjeryj99cpse6dh4w.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the “fac” Business Knowledge Model (in short, BKM) node defining the actual Factorial function recursively as:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xp6YIbGZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/00ojojwchiqnzx2c124a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xp6YIbGZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/00ojojwchiqnzx2c124a.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we can notice, the function invokes itself as any other normal &lt;a href="https://www.google.com/search?q=recursion"&gt;recursive&lt;/a&gt; function, the only difference here is that it is defined as part of a DMN Boxed Expression; the name of this function is defined by the BKM node with the boxed expression construct “fac”, then the body of the function make reference and invokes itself as part of the FEEL expression “fac(n-1)”.&lt;/p&gt;

&lt;p&gt;We can use this BKM to calculate the actual result as passed by the Input Data node, as part of the “compute factorial” Decision, as:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uyPmvxM3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/f8hey6smuiddiz2k2i4q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uyPmvxM3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/f8hey6smuiddiz2k2i4q.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This works well and gives the expected results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    My number: 3
    fac: function fac( n )
    compute factorial: 6
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  ABOUT CURRYING
&lt;/h1&gt;

&lt;p&gt;DMN and more importantly the FEEL language allow to define and invoke &lt;a href="https://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application"&gt;curried&lt;/a&gt; functions.&lt;/p&gt;

&lt;p&gt;This allows us to write in FEEL something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{ f : function(a) function(b) a + b, r : f(1)(2) }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;we defined a feel:context with 2 entries&lt;/li&gt;
&lt;li&gt;the first entry is named “f” and defines a curried function: a function of one parameter “a” that, once invoked, will return a function of one parameter “b” that, once invoked, will return the sum of a+b&lt;/li&gt;
&lt;li&gt;the latter entry named “r” which invokes the curried function with a=1 and b=2.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Albeit this is potentially a weird looking FEEL expression, we are not surprised once executed &lt;code&gt;r = 3&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We can do equivalently by using DMN Boxed Expression constructs:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l5SaNsNt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6y6sk1mzc5eoz34yle3z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l5SaNsNt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6y6sk1mzc5eoz34yle3z.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a BKM node named “curried sum”; it is a DMN Invocable of one parameter “a” that, once invoked, will return a function of one parameter “b” that, once invoked, returns the sum of a+b.&lt;br&gt;
Again, we are not surprised once executed&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curried sum(1)(2) = 3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Y COMBINATOR: RECURSION WITHOUT RECURSION SUPPORT
&lt;/h1&gt;

&lt;p&gt;Let’s go back for a moment to the earlier recursive function example; we overlooked the fact if it’s actually formally possible for a function to call itself by its name in DMN: the DMN specification does not explicitly support this, but it doesn’t explicitly forbid it either. In other terms, recursion support is not formally specified.&lt;/p&gt;

&lt;p&gt;What-if we still needed to define a recursive function, but we found the road was still under construction, missing that formal recursion support? We can use a functional device, called the “&lt;a href="https://youtu.be/9T8A89jgeTI"&gt;Y Combinator&lt;/a&gt;” which allows anonymous functions to achieve recursion without relying on self-invocation by its own (unexisting) name.&lt;/p&gt;

&lt;p&gt;Let’s look at an example; we can define the Y Combinator in DMN as follows:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sHIbLurq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kpn4q7ilnmi8qzox44uf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sHIbLurq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kpn4q7ilnmi8qzox44uf.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is potentially a weird looking function :) let’s assume this was defined for us, and we can just make use of it. &lt;br&gt;
We can use it to re-define the factorial calculation as:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4tBbGaVz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/sj96zvuz3g8bblglohmh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4tBbGaVz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/sj96zvuz3g8bblglohmh.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can notice the body of the “fac” function definition is overall the same; however, this is not any longer a function invoking itself by its name: there is no trace of a call to “fac(...)” in the body of the function!&lt;br&gt;
Naturally, there is still a form of recursion happening, but this time is leveraging the name of the parameters which are in scope of the closure: “f”. &lt;br&gt;
The result works as expected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fac(3) = 6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We can take a look at another example, defining the Fibonacci sequence using the Y Combinator in DMN:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9ARHpT8X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9esbd34a20ok3f4xqjz7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9ARHpT8X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9esbd34a20ok3f4xqjz7.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We notice again there is no call to “fib(...)” in the function body, yet recursion for the calculation of the Fibonacci sequence is performed thanks to the use of the Y Combinator.&lt;br&gt;
Once again, the result works as expected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fib(5) = [1, 1, 2, 3, 5]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;For extra fun, we can re-define the Y Combinator using where possible the DMN Boxed Expression forms. This is an interesting exercise to see how closures are applied in their boxed variant. The Y Combinator definition could be refactored as:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OQdbbSCJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hds2hfnqu2spqg1ckjjg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OQdbbSCJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hds2hfnqu2spqg1ckjjg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and that would yield again the same expected and correct results.&lt;/p&gt;

&lt;p&gt;For (extra (extra fun)), we can re-define once more the Y Combinator in a single FEEL expression to calculate for instance the factorial of 4:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{ Y: function(f) (function(x) x(x))(function(y) f(function(x) y(y)(x))), fac: Y(function(f) function(n) if n &amp;gt; 1 then n * f(n-1) else 1), fac4: fac(4) }.fac4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The result is unsurprisingly: &lt;code&gt;24&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  CONCLUSION
&lt;/h1&gt;

&lt;p&gt;In this post, we have seen a basic example of recursion in DMN, and how to leverage recursion support in the engine is very simple to use; &lt;strong&gt;engine recursion support is the approach we recommend&lt;/strong&gt; to achieve recursion DMN: give the function a name, and in the body of the function make use of that name to invoke itself. In the example, we have named the function “fac”, then we invoked “fac(...)” in the body of the function itself.&lt;br&gt;
This approach is very practical, easy to model in DMN and works just fine.&lt;/p&gt;

&lt;p&gt;We have also seen how DMN and FEEL do indeed support curried function definition and invocation. FEEL is (also) a functional language; all these properties allow us to define in DMN and use the Y Combinator, a functional device to achieve recursion without recursion support!&lt;/p&gt;

&lt;p&gt;I personally found these exercises very interesting to apply functional programming concepts in DMN, while at the same time making sure the engine worked as expected. I would like to say special thanks to my colleagues Edoardo Vacchi and Luca Molteni for their support while discussing the Y Combinator and Currying functions. &lt;/p&gt;

&lt;p&gt;Interested in DMN?&lt;br&gt;
If you didn’t know about DMN before, you found this post interesting but looking for a gentle introduction to the DMN standard, we have just the right crash course on DMN, freely available for you at:&lt;br&gt;
&lt;a href="http://learn-dmn-in-15-minutes.com/"&gt;http://learn-dmn-in-15-minutes.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find additional information on the Drools website &lt;a href="https://drools.org/learn/dmn.html"&gt;here&lt;/a&gt;. Don’t hesitate to contact us for more information.&lt;/p&gt;

</description>
      <category>dmn</category>
      <category>drools</category>
      <category>ycombinator</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Recent Drools DMN open source engine performance improvements</title>
      <dc:creator>Matteo Mortari</dc:creator>
      <pubDate>Mon, 12 Aug 2019 18:24:00 +0000</pubDate>
      <link>https://dev.to/tarilabs/recent-drools-dmn-open-source-engine-performance-improvements-4bmc</link>
      <guid>https://dev.to/tarilabs/recent-drools-dmn-open-source-engine-performance-improvements-4bmc</guid>
      <description>&lt;p&gt;We are always looking to improve the performance of the &lt;a href="https://drools.org/learn/dmn.html"&gt;Drools DMN open source engine&lt;/a&gt;. We have recently reviewed a DMN use-case where the actual input population of Input Data nodes varied to some degree; this highlighted a suboptimal behavior of the engine, which we improved in recent releases. I would like to share our findings!&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmark development
&lt;/h2&gt;

&lt;p&gt;As we started running a supporting benchmark for this use-case, especially when investigating the scenario of large DMN models with sparse-populated input data nodes, we noticed some strange results: the flamegraph data highlighted a substantial performance hit when logging messages, consuming very significant time in comparison to the application logic itself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://1.bp.blogspot.com/-l-LzjpebOKo/XVGE-M6ip5I/AAAAAAAAavo/gAFOLIV2PTE8FfdW41g0SU2eRxmfRR5EACLcBGAs/s1600/flamegraph.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8nx9P3Wg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://1.bp.blogspot.com/-l-LzjpebOKo/XVGE-M6ip5I/AAAAAAAAavo/gAFOLIV2PTE8FfdW41g0SU2eRxmfRR5EACLcBGAs/s640/flamegraph.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This flamegraph highlight specifically that a large portion of time is consumed by stacktrace synthesis, artificially induced by the logging framework. The correction, in this case, was to tune the logging configuration to avoid this problem; specifically, we disabled a feature of the logging framework which is very convenient during debugging activities, enabling to quickly locate the original calling class and methods: unfortunately this feature come at the expense of synthesizing stacktraces, which originally contaminated the benchmark results. Lesson learned here: always check first if non-functional requirements are actually masking the real issue!&lt;/p&gt;

&lt;p&gt;This was a necessary and propaedeutic step, before proceeding to investigate the use-case in more details.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Improving performance
&lt;/h2&gt;

&lt;p&gt;Moving on and focusing now on DMN optimizations, we specifically developed a benchmark to be general enough, but also highlighting the use-case which was presented to us. This benchmark consists of a DMN model with many (500) decision nodes to be evaluated. Another parameter controls sparseness of input data nodes valorization for evaluation; ranging from a value of 1 where all inputs are populated, to 2 where only one out of two inputs is actually populated, etc.&lt;/p&gt;

&lt;p&gt;This specific benchmark proved to be a very instrumental tool to highlight some potential improvements.   &lt;/p&gt;

&lt;p&gt;Setting the comparison baseline to Drools release 7.23.0.Final, the first optimization implemented with &lt;a href="https://issues.jboss.org/browse/DROOLS-4204"&gt;DROOLS-4204&lt;/a&gt; focused on improving context handling while evaluating FEEL expressions and demonstrated to offer a ~3x improvement, while further optimization implemented with &lt;a href="https://issues.jboss.org/browse/DROOLS-4266"&gt;DROOLS-4266&lt;/a&gt; focusing on specific case for decision table input clauses demonstrated an additional ~2x improvement on top of DROOLS-4204.&lt;/p&gt;

&lt;p&gt;We also collected these measurements in the following graphs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://1.bp.blogspot.com/-musedBeWBLs/XVGFwczABFI/AAAAAAAAavw/DAGvBeLMxGkK05yeT9VRG9jvvEgGv5WFQCLcBGAs/s1600/chart%2B%25283%2529.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3MHtk-r7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://1.bp.blogspot.com/-musedBeWBLs/XVGFwczABFI/AAAAAAAAavw/DAGvBeLMxGkK05yeT9VRG9jvvEgGv5WFQCLcBGAs/s640/chart%252B%2525283%252529.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This graph highlights the compounding improvements in the case of sparseness factor equal to 1, where all inputs are populated; this was a very important result, as in fact it did represent the &lt;strong&gt;main&lt;/strong&gt; , “happy path” scenario in the original use-case.&lt;/p&gt;

&lt;p&gt;In other words, we achieved a ~6x improvement in comparison to running the same use-case on 7.23.0.Final. The lesson I learned here is to always strive for these kind of &lt;em&gt;compounding&lt;/em&gt; improvements when possible, as they really build on top of each other, for greater results!&lt;/p&gt;

&lt;p&gt;For completeness, we repeated the analysis with sparseness factor equals to 2 (1 every 2 inputs is actually populate) and 50 (1 every 50 inputs is actually populated) with the following measurements:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://1.bp.blogspot.com/-maGVgo4ujlM/XVGGQTUK__I/AAAAAAAAav8/1WJnm4nDKrM0hCyU4kVatRSJJ-h9rdC9gCLcBGAs/s1600/chart%2B%25282%2529.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ejQI6vhD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://1.bp.blogspot.com/-maGVgo4ujlM/XVGGQTUK__I/AAAAAAAAav8/1WJnm4nDKrM0hCyU4kVatRSJJ-h9rdC9gCLcBGAs/s640/chart%252B%2525282%252529.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Results show that the optimizations were also significant for sparseness factor equal to 2, but not as relevant improvements as this factor grows -- which is expected, as the impact of the decision nodes evaluations on the overall logic of execution become now less relevant. &lt;/p&gt;

&lt;p&gt;For completeness, analysis was also performed with another, already existing benchmark for single decision table consisting of many rules rows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://1.bp.blogspot.com/-vihCDOZEsc0/XVGGVhbVkNI/AAAAAAAAawA/yxQa64vTOhI-O9Zgi0g9t5MPwS0lZ4lCwCLcBGAs/s1600/chart%2B%25284%2529.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xCCnpsa0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://1.bp.blogspot.com/-vihCDOZEsc0/XVGGVhbVkNI/AAAAAAAAawA/yxQa64vTOhI-O9Zgi0g9t5MPwS0lZ4lCwCLcBGAs/s640/chart%252B%2525284%252529.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Results show that these code changes considered as a whole, still offered a relevant improvement; although clearly not of the same &lt;em&gt;magnitude&lt;/em&gt; as for the original use-case. This was another important check to ensure that these improvements were not overfitting on the specific use-case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;Considering Drools release 7.23.0.Final as the baseline, and a reference benchmark consisting of a DMN model with many decision nodes to be evaluated, we implemented several optimizations that once combined demonstrated to offer a total of ~6x speed-up on that specific use case!&lt;/p&gt;

&lt;p&gt;I hope this was an interesting post to highlight some of the dimensions were to look into to achieve better performances; let us know you thoughts and feedback.&lt;/p&gt;

&lt;p&gt;You can already benefit today from these Kie &lt;a href="https://drools.org/learn/dmn.html"&gt;DMN open source engine&lt;/a&gt; improvements in the most recent releases of Drools! &lt;/p&gt;

</description>
      <category>dmn</category>
      <category>drools</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
