Hi, Wolfgang,

 

I think I’ve figured out some answers and see my shares below. Thanks and let me know your thoughts about #3.

 

Best

Abe

 

1.       Will I gain better performance if I put the rule differentiator condition compareToPostThreshold($txn)==2 at the beginning of both rule 1 and 2?

One kind pf Rete optimization is based on evaluating common constraints once, therefore: no.

//Abe: it definitely makes a difference if you put differentiator conditions at the beginning – this way RETE won’t waste efforts constructing networks which will not fulfill. See below example.

rule "Evaluation of assignment in r-value position"
no-loop true
when
 $statement:CStatement($value:value)
 eval(Matcher.isRVExpression($value))

 eval(0==Matcher.getClauseNum())
then
 System.out.println($value);
 modify($statement){
  setSemantics(Matcher.getRVSemantics(memory,$value));
 }
end

rule "Evaluation of assignment clause in r-value position without updating memory"
no-loop true
when
 $statement:CStatement($value:value)
 eval(Matcher.isRVExpression($value))

 eval(0<Matcher.getClauseNum())
then
 System.out.println("=="+$value);
 Matcher.decreaseClauseNum();
 modify($statement){
  setSemantics(Matcher.getRVSemanticsWithoutUpdate(memory,$value));
 }
end

 

These two rules try to validate if Matcher.getClauseNum() ==0 or <0. If you put differentiator “Matcher.getClauseNum()” at the end of LHS, Drools will start two threads to deduct RETE network so even if the fact hits rule 1, rule 2 will still be stepped in. But if we make the two rules as below, RETE will identify the shortcut correctly and no thread will be triggered to step into rule 2:

 

rule "Evaluation of assignment in r-value position"
no-loop true
when
 eval(0==Matcher.getClauseNum())
 $statement:CStatement($value:value)
 eval(Matcher.isRVExpression($value))
then
 System.out.println($value);
 modify($statement){
  setSemantics(Matcher.getRVSemantics(memory,$value));
 }
end

rule "Evaluation of assignment clause in r-value position without updating memory"
no-loop true
when
 eval(0<Matcher.getClauseNum())
 $statement:CStatement($value:value)
 eval(Matcher.isRVExpression($value))
then
 System.out.println("=="+$value);
 Matcher.decreaseClauseNum();
 modify($statement){
  setSemantics(Matcher.getRVSemanticsWithoutUpdate(memory,$value));
 }
end

 

2.       I saw salaboys video claiming that to avoid using eval() in the rule. Do we have any alternative way to do that from a performance consideration

Constraints based on fields using == are best. Other things may result in eval-like evaluations anyway. Most of the time, it isn't eval that causes performance setbacks.

or Id better collect/ prepare all the data before I send them into the session?

Not clear what you mean by this, but if you can provide attributes that lend themselves to straightforward constraints it might be worthwhile considering some up-front processing of facts.
 //Abe: I saw below statement from Drools document 5.2.0. As Eval is not indexed, overuse of evale reduces the rules’ clarity and will result in a bad performance.

5.8.3.7. Conditional Element eval

eval

Figure 5.29. eval

 

The conditional element eval is essentially a catch-all which allows any semantic code (that returns a primitive boolean) to be executed. This code can refer to variables that were bound in the LHS of the rule, and functions in the rule package. Overuse of eval reduces the declarativeness of your rules and can result in a poorly performing engine. While eval can be used anywhere in the patterns, the best practice is to add it as the last conditional element in the LHS of a rule.

Evals cannot be indexed and thus are not as efficient as Field Constraints. However this makes them ideal for being used when functions return values that change over time, which is not allowed within Field Constraints.

 

3.       Whats you guys naming convention for rules salience?

Not clear what you mean by that.

//Abe: I mean how do you weight your salience values across different rules. I’ve seen various styles in my project – somebody uses 100, 200, 300 but somebody uses 90, 100, 110, 120, etc. This is not a big problem as they are working on different rules and won’t pollute each other. However I would still try to make it consistent so maintain each other’s rule files will be easier…

 

发件人: rules-users-bounces@lists.jboss.org [mailto:rules-users-bounces@lists.jboss.org] 代表 Wolfgang Laun
发送时间: 20111226 22:20
收件人: Rules Users List
主题: Re: [rules-users] Performance consideration in rule writing

 

See below.

2011/12/26 Zhuo Li <milanello1998@gmail.com>

Hi, team,

 

I have some quick questions here regarding performance best practices of rule writing. See below two pieces of rules:

 

Rule “1”

         Salience 100

         No-loop true

         When $txn : data(sourceid == 5&&txnjustify==”995”&&eval(creditOption($txn)==1)&&eval(isGCSwitch($txn))&&isCurrencyEquals($txn)==0&&compareToPostThreshold($txn)==2);

         Then

                   …

         End

 

Rule “2”

         Salience 100

         No-loop true

         When $txn : data(sourceid == 5&&txnjustify==”995”&&eval(creditOption($txn)==1)&&eval(isGCSwitch($txn))&&isCurrencyEquals($txn)==0&&compareToPostThreshold($txn)==1);

         Then

                  …

         End

 

Questions:

1.       Will I gain better performance if I put the rule differentiator condition compareToPostThreshold($txn)==2 at the beginning of both rule 1 and 2?

One kind pf Rete optimization is based on evaluating common constraints once, therefore: no.
 

2.       I saw salaboys video claiming that to avoid using eval() in the rule. Do we have any alternative way to do that from a performance consideration

Constraints based on fields using == are best. Other things may result in eval-like evaluations anyway. Most of the time, it isn't eval that causes performance setbacks.

or Id better collect/ prepare all the data before I send them into the session?

Not clear what you mean by this, but if you can provide attributes that lend themselves to straightforward constraints it might be worthwhile considering some up-front processing of facts.
 

3.       Whats you guys naming convention for rules salience?

Not clear what you mean by that.

-W
 

 

PS: my Drools version is 5.2.0.

 

Best regards

Abe


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