[rules-users] Performance issues with a rule that includes LHS functions

Mike Goldner mike at thegoldners.com
Fri May 4 13:16:35 EDT 2012


Wolfgang,

Unfortunately, it would be very difficult to introduce a
procedural/algorithmic "branch" into the program flow.

Would it be possible to mimic a procedural approach within the rule using an
accumulate function to extract the desired array element and then process
the rest of the rule's login?

Mike Goldner
m: 617.909.3009

From:  Wolfgang Laun <wolfgang.laun at gmail.com>
Reply-To:  Rules Users List <rules-users at lists.jboss.org>
Date:  Friday, May 4, 2012 1:05 PM
To:  Rules Users List <rules-users at lists.jboss.org>
Subject:  Re: [rules-users] Performance issues with a rule that includes LHS
functions

Looks like an anti-pattern to me: you can expect O(n^3) effort for inserting
Data facts.

This is something where a procedural/algorithmic solution is preferable to a
rule based solution.

-W
 

On 4 May 2012 18:44, Mike Goldner <mike at thegoldners.com> wrote:
> I have a rule that is suffering severe performance degradation as I insert
> facts into the (stateful) session.  In my simplified example, the first
> 100 fact insertions take less than 10ms per fact.  By the 1000th fact,
> insertions are taking about 850ms per fact.  In production, the impact is
> much more severe, reaching 5000ms or more by the 1000th insertion.  The
> number of facts per execution can vary from a few hundred to a few
> thousand.
> 
> I've created a simplified example that demonstrates the problem:  Imagine
> that there is a line plotted through a 3-dimensional plane and it is
> necessary to ensure that each plotted coordinate is an equal distance from
> the adjacent coordinates.  I realize that the math isn't correct, but it
> is sufficient for the example.
> 
> The constraint (and source of performance degradation) imposed by my data
> source is that the plane (X, Y, or Z) is variable and it is defined by an
> separate index that serves as a pointer into the coordinate list.  If I
> remove the function calls, the problem disappears.
> 
> Any suggestions on how I could rewrite the rule?
> 
> Here is my rule:
> 
> package test;
> 
> declare Data
>         plane : int
>         coordinates : java.util.List
> end
> 
> rule "Performance degradation with functions."
>         dialect "mvel"
>         when
>                 $current : Data( $currentPosition : getPosByAxis(plane,
> coordinates) )
>                 $before : Data( $beforePosition : getPosByAxis(plane,
> coordinates) <
> $currentPosition)
>                 not Data( getPosByAxis(plane, coordinates) > $beforePosition
> && <
> $currentPosition)
>                 $after : Data($afterPosition : getPosByAxis(plane,
> coordinates) >
> $currentPosition)
>                 not Data(getPosByAxis(plane, coordinates) < $afterPosition &&
> >
> $currentPosition)
>                 eval ( ($currentPosition - $beforePosition) == ($afterPosition
> -
> $currentPosition) )
>         then
>                 System.out.println("Rule RHS fired.");
> end
> 
> function Double getPosByAxis(int plane, java.util.List coordinates) {
> 
>         return (Double) coordinates.get(plane);
> 
> }
> 
> Thanks,
> 
> Mike Goldner
> 
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users

_______________________________________________ rules-users mailing list
rules-users at lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20120504/57041157/attachment-0001.html 


More information about the rules-users mailing list