Please don't confuse my message with bashing Drools for not being as
fast as Java. While I am not very familiar with Rete, I'm aware of
what goes on behind the scenes; I've been programming declarative
optimization systems for many years. My query relates to how to
perform such a comparison with reasonable efficiency in Drools.
Tom
On Thu, Jan 21, 2010 at 7:16 PM, Greg Barton <greg_barton(a)yahoo.com> wrote:
pit->out
That falls into a rare class: two letter typos that pass a spell checker. :)
--- On Thu, 1/21/10, Greg Barton <greg_barton(a)yahoo.com> wrote:
> From: Greg Barton <greg_barton(a)yahoo.com>
> Subject: Re: [rules-users] drools performance with <
> To: "Rules Users List" <rules-users(a)lists.jboss.org>
> Date: Thursday, January 21, 2010, 9:04 PM
> This is not at all surprising.
> To set up and run the rules there's quite a bit of code
> running behind the scenes besides just the comparison test.
> (For instance, there's object creation just to track the
> fact that two objects matched the rule, and in this case
> those objects are created for every possible combination of
> TestObject instances before the first rule ever fires, then
> added to lists, and so on... So in the case of 1000
> TestObject instances, there's 1,000,000 object creations and
> list additions just for that.)
>
> So, as has been said many times on this list, and probably
> in a few blogs, for any given algorithm a hard coded java
> version will invariably be faster than rules. What
> rules gives you is a way to express solutions to complex
> problems in a flexible and comprehensible way. It
> shines when the problems are so complex that coding them
> procedurally is pit of the question.
>
> The same relationship is there between C and java.
> Java gives you managed, portable code, but for that you give
> up the raw speed of C.
>
> --- On Thu, 1/21/10, Tom Carchrae <carchrae(a)gmail.com>
> wrote:
>
> > From: Tom Carchrae <carchrae(a)gmail.com>
> > Subject: [rules-users] drools performance with <
> > To: rules-users(a)lists.jboss.org
> > Date: Thursday, January 21, 2010, 6:40 PM
> > Hello,
> >
> > I'm new to Drools and am trying it out. I've found
> it
> > easy enough so
> > far, but quickly ran into a performance bottleneck.
> > (perhaps an all
> > too familiar story! :) ). So, I made a simple
> example
> > to try and
> > track down the behavior. Here it is.
> >
> > I wanted to create a rule that uses an <
> comparison
> > between pairs of
> > objects. The following are the performance results:
> >
> > 10 objects. Java comparison took 0 ms
> > 10 objects. Rule firing took 2516 ms
> > 100 objects. Java comparison took 0 ms
> > 100 objects. Rule firing took 1984 ms
> > 1000 objects. Java comparison took 47 ms
> > 1000 objects. Rule firing took 132500 ms
> > 10000 objects. Java comparison took 4641 ms
> > 10000 objects. Rule firing took .... (please wait...)
> >
> > Here is the rule
> >
> > rule "A < B"
> > when
> > a : TestObject(
> > )
> > b : TestObject(
> > valueDouble < a.valueDouble )
> > then
> >
> > b.setValueint(b.getValueint()+1);
> > end
> >
> > Now, I do understand that this (worst-case) is a
> comparison
> > of N x N
> > objects... so, 1000 = 1000000 comparisons. However,
> > ~100ms per
> > comparison seems relatively expensive for such a
> simple
> > check. I am
> > using StatefulKnowledgeSession (I tried Stateless but
> this
> > gave only a
> > mild performance improvement - and I would also like
> to use
> > insert in
> > some of my rules).
> >
> > How would one speed up such a query? I know part of
> > the problem is
> > the < comparison. The results with == are much
> > better (presumably, it
> > can do lots of pruning of the space)
> >
> > Model creation 0
> > 10 objects. Rule firing took 2829 ms
> > 100 objects. Rule firing took 93 ms
> > 1000 objects. Rule firing took 657 ms
> > 10000 objects. Rule firing took 3375 ms
> > 100000 objects. Rule firing took 33266 ms
> >
> > I have thought about clever tricks that I could do to
> try
> > and speed
> > things up, like sorting into groups, etc. But it
> all
> > seems relatively
> > convoluted. Am I correct in coming to the
> conclusion
> > that a <
> > comparison is not the kind of thing that you should do
> in
> > Drools?
> >
> > How would you go about this? I would prefer to keep
> > all the logic in
> > the DRL files. I'm guessing you do a Java based
> > comparison and use a
> > fire-once rule to invoke this code.
> >
> > Thanks in advance for any insight,
> >
> > Tom
> > _______________________________________________
> > rules-users mailing list
> > rules-users(a)lists.jboss.org
> >
https://lists.jboss.org/mailman/listinfo/rules-users
> >
>
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-users
>
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users