Other than the impact on heap and gc the size of the object does not impact performance.
You mention you have “deeply nested objects”, but your code is not showing if drools has
visibility to those or not. If it’s not doing any additional traversal, then there should
be no extra cost.
Maybe try a profiler? You might find there is time being used up in your object hierarchy
somewhere, maybe construction and initialization?
Mark
On 22 Feb 2014, at 04:47, mikerod <mjr4184(a)gmail.com> wrote:
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...
Sent from the Drools: User forum mailing list archive at
Nabble.com.
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users