Sorry, because of the time difference, I delayed to reply you. I have already finished test destined by you. To my surprise, the result of test is very fast, it lasted only 0.6 seconds. Could you tell me why?
And , you justed asked me:" do you really want to call >workingMemory.fireAllRules() inside your for loop?" You are right, I really want to do this. This is my invoke code with drools package com.datangmobile.rules; import java.io.InputStreamReader; import java.io.Reader; import org.drools.RuleBase; import org.drools.RuleBaseFactory; import org.drools.WorkingMemory; import org.drools.compiler.PackageBuilder; import org.drools.rule.Package; public class alarmrules { public static final void main(String[] args) { alarmrules malarmrules = new alarmrules(); malarmrules.startRule(); } void startRule() { try { //load up the rulebase RuleBase ruleBase = readRule(); workingMemory = ruleBase.newWorkingMemory(); //insert alarmdefine for(int i=1; i<50000; i++){ alarmdefine malarmdefine = new alarmdefine(); malarmdefine.setAlarmreason(i); malarmdefine.setAlarmlevel(2); malarmdefine.setObjtype(i % 4); malarmdefine.setAlarmtype(2); workingMemory.assertObject( malarmdefine ); workingMemory.fireAllRules(); } //insert alarm for(int i=1; i<10000; i++) { alarm malarm = new alarm(); malarm.setAlarmreason(i); malarm.setAlarmlevel(1); malarm.setObjtype(i % 4); malarm.setAlarmtype(2); malarm.setDn("rnc=1"); workingMemory.assertObject( malarm ); workingMemory.fireAllRules(); } } catch (Throwable t) { t.printStackTrace(); } } private static RuleBase readRule() throws Exception { //read in the source Reader source = new InputStreamReader( alarmrules.class.getResourceAsStream( "/alarm.drl" ) ); PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl( source ); Package pkg = builder.getPackage(); RuleBase ruleBase = RuleBaseFactory.newRuleBase(); ruleBase.addPackage( pkg ); return ruleBase; } private static WorkingMemory workingMemory; } This is my invoke code with JESS: package com.datangmobile.rules; import jess.*; public class alarmrulesJess { public static final void main(String[] args) { alarmrulesJess malarmrules = new alarmrulesJess(); malarmrules.startRule(); } private void startRule(){ try { Rete rete = new Rete(); rete.executeCommand("(batch alarmTest.clp)"); //insert alarmdefine for(int i=1; i<50000; i++){ alarmdefine malarmdefine = new alarmdefine(); malarmdefine.setAlarmreason(i); malarmdefine.setAlarmlevel(2); malarmdefine.setObjtype(i % 4); malarmdefine.setAlarmtype(2); rete.definstance("alarmdef",malarmdefine,false); rete.run(); } //insert alarm for(int i=1; i<10000; i++) { alarm malarm = new alarm(); malarm.setAlarmreason(i); malarm.setAlarmlevel(1); malarm.setObjtype(i % 4); malarm.setAlarmtype(2); malarm.setDn("rnc=1"); rete.definstance("alarm", malarm ,false); rete.run(); } } catch (Throwable t) { t.printStackTrace(); } } } Thanks wangwei 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 >>> >>> >>> >>> >>> >> >> >> >> > > > >