[jboss-jira] [JBoss JIRA] Updated: (JBRULES-1056) Performance of RuleBase().addPackage(.) goes down on sub sequent instances of RuleBase with large number of packages.

Ming Jin (JIRA) jira-events at lists.jboss.org
Thu Aug 2 17:10:49 EDT 2007


     [ http://jira.jboss.com/jira/browse/JBRULES-1056?page=all ]

Ming Jin updated JBRULES-1056:
------------------------------

    Attachment: testdrools.zip

> Performance of RuleBase().addPackage(.) goes down on sub sequent instances of RuleBase with large number of packages.
> ---------------------------------------------------------------------------------------------------------------------
>
>                 Key: JBRULES-1056
>                 URL: http://jira.jboss.com/jira/browse/JBRULES-1056
>             Project: JBoss Rules
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>          Components: Drl Parser/Builder
>    Affects Versions:  4.0.0.GA
>         Environment: Windows
>            Reporter: Ming Jin
>         Assigned To: Mark Proctor
>         Attachments: testdrools.zip
>
>
> I encountered a strange behavior when trying to test the performance of rule registration, meaning to add Package's to a new instance of RuleBase.  I ran the same test 5 times in a sequence, and the RuleBase instance was discarded right away.  The test ran with different different number of packages, 20, 50, 100, and 200.  The results are as the followings:
>  
> Added 20 packages to rulebase in 0:00:0.15
> Added 20 packages to rulebase in 0:00:0.21
> Added 20 packages to rulebase in 0:00:0.21
> Added 20 packages to rulebase in 0:00:0.301
> Added 20 packages to rulebase in 0:00:0.18
> Added 20 packages to rulebase 5 times in 0:00:1.051
>  
> Added 50 packages to rulebase in 0:00:0.17
> Added 50 packages to rulebase in 0:00:1.422
> Added 50 packages to rulebase in 0:00:1.252
> Added 50 packages to rulebase in 0:00:1.322
> Added 50 packages to rulebase in 0:00:1.331
> Added 50 packages to rulebase 5 times in 0:00:5.497
>  
> Added 100 packages to rulebase in 0:00:0.19
> Added 100 packages to rulebase in 0:00:5.278
> Added 100 packages to rulebase in 0:00:5.297
> Added 100 packages to rulebase in 0:00:5.228
> Added 100 packages to rulebase in 0:00:5.327
> Added 100 packages to rulebase 5 times in 0:00:21.32
>  
> Added 200 packages to rulebase in 0:00:0.22
> Added 200 packages to rulebase in 0:00:21.691
> Added 200 packages to rulebase in 0:00:21.481
> Added 200 packages to rulebase in 0:00:21.642
> Added 200 packages to rulebase in 0:00:21.341
> Added 200 packages to rulebase 5 times in 0:01:26.385
>  
> As you can see, the timing of creating first RuleBase instance is always good, while the subsequent one's were very bad.  Is there an attribute I could adjust in configuration to improve the performance for this scenario?  Please advise if there is other alternatives.  I would be glad to provide details if needed.
> The following test program would demonstrate the problem:
> import java.util.List;
> import java.util.ArrayList;
> import java.util.Random;
> import java.io.StringReader;
> import java.io.IOException;
> import org.drools.rule.Package;
> import org.drools.compiler.PackageBuilder;
> import org.drools.compiler.DroolsParserException;
> import org.drools.RuleBase;
> import org.drools.RuleBaseFactory;
> /**
>  * Created by IntelliJ IDEA. User: SG0521861 Date: Aug 2, 2007 Time: 2:53:50 PM To change this template use File |
>  * Settings | File Templates.
>  */
> public class TestDrools {
>   private static final String ALPHABET= "abcdefghijklmnopqrstuvwxyz";
>   private static final String DRL_TEMPLATE  =
>           "package testpackage\n" +
>           "import test.TestObject\n"+
>           "rule \"testrule_$1\"\n" +
>           "  when\n" +
>           "    h:TestObject(value1==\"$2\", value2 in (\"$3\"))\n" +
>           "  then\n" +
>           "    h.setResult(\"$4\");\n" +
>           "end";
>   private int count;
>   public TestDrools(int count) {
>     this.count  = count;
>   }
>   public void run() throws Exception {
>     List<String>  drls  = generateDrls();
>     List<Package> pkgs  = generatePackages(drls);
>     for (int i = 0; i < 3; i++) {
>       addPackages(pkgs, i+1);
>     }
>   }
>   private static RuleBase addPackages(List<Package> pkgs, int id) throws Exception {
>     long     time  = System.currentTimeMillis();
>     RuleBase rb  = RuleBaseFactory.newRuleBase();
>     for (Package pkg : pkgs)
>       rb.addPackage(pkg);
>     System.out.println("Added "+pkgs.size()+" packages to rulebase"+id+" in "+
>                        (System.currentTimeMillis()-time)/1000.0+" seconds");
>     return rb;
>   }
>   private List<String> generateDrls() {
>     List<String>  list  = new ArrayList<String>(count);
>     for (int i = 0; i < count; i++) {
>       list.add(getDrl(i));
>     }
>     return list;
>   }
>   private static List<Package> generatePackages(List<String> drls) throws DroolsParserException, IOException {
>     List<Package> list  = new ArrayList<Package>(drls.size());
>     for (String drl : drls) {
>       PackageBuilder  builder = new PackageBuilder();
>       builder.addPackageFromDrl(new StringReader(drl));
>       list.add(builder.getPackage());
>     }
>     return list;
>   }
>   private String getDrl(int seed) {
>     String  drl = DRL_TEMPLATE.replace("$1", Integer.toString(seed));
>     drl = drl.replace("$2", getRandomString());
>     drl = drl.replace("$3", getRandomString());
>     return drl.replace("$4", getRandomString());
>   }
>   private Random  rand  = new Random();
>   private String getRandomString() {
>     StringBuilder sb  = new StringBuilder();
>     for (int i = Math.abs(rand.nextInt() % 16) + 1; i-- > 0; )
>       sb.append(ALPHABET.charAt(Math.abs(rand.nextInt() % ALPHABET.length())));
>     return sb.toString();
>   }
>   public static void main(String[] argv) {
>     if (argv.length > 0) {
>       try {
>         new TestDrools(Integer.parseInt(argv[0])).run();
>       }
>       catch (Exception ex) {
>         ex.printStackTrace();
>       }
>     }
>     else
>       System.out.println("Usage: TestDrool [# of packages]");
>   }
> }
> package test;
> /**
>  * Created by IntelliJ IDEA. User: SG0521861 Date: Aug 2, 2007 Time: 3:38:13 PM To change this template use File |
>  * Settings | File Templates.
>  */
> public class TestObject {
>   private String  value1;
>   private String  value2;
>   private String  result;
>   public String getValue1()             { return value1; }
>   public void setValue1(String value1)  { this.value1 = value1; }
>   public String getValue2()             { return value2; }
>   public void setValue2(String value2)  { this.value2 = value2; }
>   public String getResult()             { return result; }
>   public void setResult(String result)  { this.result = result; }
> }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the jboss-jira mailing list