Wangwei,

One simple test I would like you to try is to change your rule from this:

    alarmdefine(alarmreason==reason, alarmlevel!=level)

 To this:

    alarmdefine(alarmlevel!=level, alarmreason==reason)


Let me know if you can run the same test this way.

Thank you,
Edson



Edson Tirelli wrote:

> Wangwei,
>
>Just to be sure I understood your code, do you really want to call
>workingMemory.fireAllRules() inside your for loop? I assume when you run
>the same code in Jess you call "(run)" the same number of times, right?
>We know we are still slower then Jess as we have some overheads that
>Jess doesn't face (to not speak in our 6 months old compared to Jess
>years old). We, of course, are working on improving the performance.
>But, what we are seeing is, for instance, in informal benchmarks we ran,
>like Manners with 64 guests, Jess is 3 times faster. If we raise to 128
>guests, we scale better and Jess is only 2 times faster.
>Also, the way you wrote the rule makes possible for Drools to use its
>indexed join optimizations, so it is the best scenario. It is really
>amazing the performance difference. If you can, would you please send us
>the whole invocation code, in a way we can run here and see what is
>being optimized and what is not? Also, it would be good to have the jess
>code, just to be sure we are comparing apples to apples.
>
>Thanks, I do appreciate.
>
>Edson
>
>
>[EMAIL PROTECTED] wrote:
>
>  
>
>>Thanks, the whole rule file:
>>
>>package com.datangmobile.rules
>>
>>import com.datangmobile.rules.alarmdefine;
>>import com.datangmobile.rules.alarm;
>>
>>rule "alarmdefine"
>>      no-loop true
>>      when
>>              #conditions
>>              alarm(reason:alarmreason, level:alarmlevel)
>>              alarmdefine(alarmreason==reason, alarmlevel!=level)
>>      then 
>>              #actions
>>              alarm.setCounter();
>>end
>>
>>alarmdefine object:
>>package com.datangmobile.rules;
>>
>>public class alarmdefine {
>>      
>>      private int alarmreason;
>>      private int alarmlevel;
>>      private int objtype;
>>      private int alarmtype;
>>      
>>      public int getAlarmlevel() {
>>              return alarmlevel;
>>      }
>>      public void setAlarmlevel(int alarmlevel) {
>>              this.alarmlevel = alarmlevel;
>>      }
>>      public int getAlarmreason() {
>>              return alarmreason;
>>      }
>>      public void setAlarmreason(int alarmreason) {
>>              this.alarmreason = alarmreason;
>>      }
>>      public int getAlarmtype() {
>>              return alarmtype;
>>      }
>>      public void setAlarmtype(int alarmtype) {
>>              this.alarmtype = alarmtype;
>>      }
>>      public int getObjtype() {
>>              return objtype;
>>      }
>>      public void setObjtype(int objtype) {
>>              this.objtype = objtype;
>>      }
>>}
>>
>>alarm object:
>>package com.datangmobile.rules;
>>
>>public class alarm {
>>
>>      private int alarmreason;
>>      private int alarmlevel;
>>      private int objtype;
>>      private int alarmtype;
>>      private String dn;
>>      
>>      static private int counter = 0;
>>      
>>      public int getAlarmlevel() {
>>              return alarmlevel;
>>      }
>>      public void setAlarmlevel(int alarmlevel) {
>>              this.alarmlevel = alarmlevel;
>>      }
>>      public int getAlarmreason() {
>>              return alarmreason;
>>      }
>>      public void setAlarmreason(int alarmreason) {
>>              this.alarmreason = alarmreason;
>>      }
>>      public int getAlarmtype() {
>>              return alarmtype;
>>      }
>>      public void setAlarmtype(int alarmtype) {
>>              this.alarmtype = alarmtype;
>>      }
>>      public String getDn() {
>>              return dn;
>>      }
>>      public void setDn(String dn) {
>>              this.dn = dn;
>>      }
>>      public int getObjtype() {
>>              return objtype;
>>      }
>>      public void setObjtype(int objtype) {
>>              this.objtype = objtype;
>>      }       
>>      
>>      static public void setCounter(){
>>              
>>              counter++;
>>      }
>>      
>>      static public int getCounter(){
>>              return counter;
>>      }
>>}
>>
>>
>>
>>can you provide your objects that you are using, and the whole rule file?
>>
>>On 4/26/06, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
>> 
>>
>>    
>>
>>>Dear user group:
>>>
>>>       I have a queston about the performance of drools3.0.
>>>    My only one rule is:
>>>
>>>    rule "alarmdefine"
>>>    no-loop true
>>>    when
>>>    #conditions
>>>    alarm(reason:alarmreason, level:alarmlevel)
>>>    alarmdefine(alarmreason==reason, alarmlevel!=level)
>>>    then
>>>    #actions
>>>    alarm.setCounter();?
>>>    end
>>>
>>>    My eviroment:  eclipse3.2M5, jdk1.4.2-03
>>>       Testcode is :
>>>
>>>                  for(int i=1; i<1000; i++)
>>>           {
>>>               alarm malarm = new alarm();
>>>               malarm.setAlarmreason(i);
>>>               malarm.setAlarmlevel(1);
>>>               malarm.setObjtype(1);
>>>               malarm.setAlarmtype(1);
>>>             workingMemory.assertObject( malarm );
>>>    workingMemory.fireAllRules();
>>>           }
>>>
>>>    when alarmdefine exist 50000 record,  execute time is 20s
>>>    when alarmdefine exist 5000 recode,  execute time is 2s
>>>
>>>    Then I have done the same test with JESS, the rule is:
>>>
>>>    (defrule alarm-cleared-all
>>>    (alarm (alarmreason ?a) (alarmlevel ?x) )
>>>    (alarmdef (alarmreason ?a) (alarmlevel ?y&:(<> ?y ?x)))
>>>    =>
>>>    (call alarm setCounter)
>>>    )
>>>
>>>    when alarmdefine exist 50000 record, execute time is only 0.2s
>>>
>>>    Great difference!  Why?  What can I do?
>>>
>>>    Thanks
>>>    Wangwei
>>>
>>>   
>>>
>>>      
>>>
>> 
>>
>>    
>>
>
>
>  
>

Reply via email to