It's probably the "or" that's having the largest impact, but you may
be able to reduce the time somewhat by using direct matching yourself
-- i.e., just use
(R (ProductFamily "campaign_02703"|nil)
instead of
(R (ProductFamily ?ProductFamily&:(eq ?ProductFamily "campaign_02703")|
nil)
on the other hand, coding the "or" as a single function call might
help, too (you'll have to test both of these and see which is better:)
(R (ProductFamily ?ProductFamily&:(or (eq ?ProductFamily
"campaign_02703") (eq ?ProductFamily nil)))
Note that at runtime all three of these are going to end up in exactly
the same form -- it's just the path to get there that may change.
On Oct 2, 2008, at 10:28 AM, Adair, John wrote:
Usually for us the tradeoff works out fine, as we create the
rulesets and reuse them over a large number of facts, so the parse
time gets amortized and isn't a problem. Unfortunately in this case
the parse time is dominating the execution time.
Do you see any easy semantics-preserving things I could do to my
rules to make them more efficiently parseable? Alternatively, can
you think of any changes I could make to the parsing that might help
in this case?
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:owner-jess-
[EMAIL PROTECTED] On Behalf Of Ernest Friedman-Hill
Sent: Wednesday, October 01, 2008 9:58 PM
To: jess-users
Subject: Re: JESS: parse time
We don't really try to optimize rule compilation time; in general,
time taken to compile rules is supposed to pay off later when
they're used. The function calls in the second form of rule are
going to get expanded and combined, and Jess is going to try to
transform them into direct pattern matches, and a lot of work gets
done as Jess figures out the best way to do it. There's also the
simple matter of merging the rules into a single network, which
ultimately comes down to figuring out if there are duplicate pattern
matches across rules; comparing function-call objects is more
expensive than comparing tests against literals.
On Oct 1, 2008, at 6:19 PM, Adair, John wrote:
Would you expect to see dramatically different parse times for the
following rules?
(defrule r0
(R (ProductFamily "campaign_02703")
(SKU "2989")
(_r ?o)
) => (?o a (rx))
)
(defrule r0
(R (ProductFamily ?ProductFamily&:(eq ?ProductFamily
"campaign_02703")|nil)
(SKU ?SKU&:(eq ?SKU "2989")|nil)
(_r ?o)
) => (?o a (rx))
)
For 6,600 rules of the first form, the parse time is below 3 seconds,
but for the same number of rules of the second form, the parse time
is
above 10 seconds.
These times are on 7.1, although my investigation was prompted by a
performance problem in our production app, which is on 7.0, so it
should be similar there.
--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users
[EMAIL PROTECTED]'
in the BODY of a message to [EMAIL PROTECTED], NOT to the list
(use
your own address!) List problems? Notify owner-jess-
[EMAIL PROTECTED] .
--------------------------------------------------------------------
---------------------------------------------------------
Ernest Friedman-Hill
Informatics & Decision Sciences, Sandia National Laboratories PO Box
969, MS 9012, Livermore, CA 94550 http://www.jessrules.com
--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users
[EMAIL PROTECTED]'
in the BODY of a message to [EMAIL PROTECTED], NOT to the list
(use your own address!) List problems? Notify [EMAIL PROTECTED]
.
--------------------------------------------------------------------
--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users
[EMAIL PROTECTED]'
in the BODY of a message to [EMAIL PROTECTED], NOT to the list
(use your own address!) List problems? Notify [EMAIL PROTECTED]
.
--------------------------------------------------------------------
---------------------------------------------------------
Ernest Friedman-Hill
Informatics & Decision Sciences, Sandia National Laboratories
PO Box 969, MS 9012, Livermore, CA 94550
http://www.jessrules.com
--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]'
in the BODY of a message to [EMAIL PROTECTED], NOT to the list
(use your own address!) List problems? Notify [EMAIL PROTECTED]
--------------------------------------------------------------------