[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