[rules-users] Object size affect on session insertion performance

mikerod mjr4184 at gmail.com
Fri Feb 21 23:47:29 EST 2014


Does the size of objects inserted into the session as facts directly affect
performance?

I have ran some very simple tests, with a kb with 1 rule that
accumulated/collected over all facts in working memory of a type.

If I have a really simple/small class, say SimpleClass

It looks like: 

```
rule "collecting"
	when
	$res : List() from
			accumulate( $s : SimpleClass(),
				init( List l = new ArrayList(); ),
				action( l.add($s); ),
				result( l ))
	then
	System.out.println("Done");
end
```

If I have a more complex class that will result in deeply nested objects,
say ComplexClass
It looks like:

```
rule "collecting"
	when
	$res : List() from
			accumulate( $s : ComplexClass(), // this is the only difference from
above
				init( List l = new ArrayList(); ),
				action( l.add($s); ),
				result( l ))
	then
	System.out.println("Done");
end

Now my Java test is just a simple one that puts a timer before and after
insert like:

``` 

// initialize kb and session as usual

// make N number of objects to insert of type SimpleClass or ComplexClass;
depending on test run
// store them in local variable cs

        final long start = System.nanoTime();
        for (final SimpleClass c : cs) { // This would be ComplexClass when
comparing
            ksession.insert(c);
        }
        final double end = ((System.nanoTime() - start) / 1000000.0);


        final int firedRules = ksession.fireAllRules(); // not really needed
here

```

What I notice from these tests, is that for something like N=5000 of
SimpleClass inserted into the session runs quick, say something like 35 sec.

However, for the same N=5000 of ComplexClass inserted into the session, the
time jumps to something like 148 sec.

I haven't done exhaustive performance testing around this, but I am seeing
this in more complex scenarios as well.
 I know that heap space (maybe perm space) play a role in this, but I have
monitored my JVM processes  during execution and there is no lack of
available heap space and my machine has a lot of resources available still
in both SimpleClass and ComplexClass scenarios.

I am trying to understand if the actual size of an object inserted into the
session has an affect on its overall performance.
This may be a trivial question and I'm just overlooking something, but I'd
appreciate any advice and feedback on this subject.  I have not successfully
been able to find any resources on the internet where this has been
explicitly asked to base any thought off of.  I also have read up some on
Rete (and variations e.g. Drools), but I don't see how the size of the
objects inserted as facts applies to the insert performance.

Thanks!







--
View this message in context: http://drools.46999.n3.nabble.com/Object-size-affect-on-session-insertion-performance-tp4028244.html
Sent from the Drools: User forum mailing list archive at Nabble.com.


More information about the rules-users mailing list