Hi.
My environment: Win XP SP3, 2x2.13 GHz cpu, 3GB RAM, Drools 4.0.7, JDK 1.4.2_11, java compiler: JANINO, dialect: java.
We have about 850 drl's with 5 - 10 conditions in each. 0 -2 evals in each. The drl's only contain one rule each.
We are using Drools programatically by compiling the drls using PackageBuilder.
addPackageFromDrl and adding them to a RuleBase using RuleBase.addPackage(PackageBuilder.getPackage())
When
we are building our rule base we are never able to compile more than 1
-2 rules per second, which means we need over 10 minutes (at 100% cpu)
to build our rulebase.
Profiling shows 68% cpu time in org.drools.rule.builder.GroupElementBuilder.build and 18% cpu time in org.codehaus.janino.Compiler.compile.
We have experimented by changing the compiler to ECLIPSE and the dialect to mvel but the results are the same.
We have experimented using one PackageBuilder instance per drl or
grouping drls by package and sharing a builder per package. Same result
in both scenarios.
We have also expermimented with compiling concurrently in serveral threads. Again, about the same result.
My question is: Is this the performance we can expect from the compiler or are we doing something fundamentally wrong?
Below
is an example of one of our drls. This one contains no evals, but still
takes more than 1 second to compile. If anyone can spot some issues
with the way we are doing things the feedback would be much apreciated
:)
------------------------------------
package domain.core.productoffer.rules.subscriptiontype
import type.productoffer.ProductOfferRuleEvent
import domain.core.subscription.Subscription
import domain.core.subscription.SubscribedService
import type.subscription.ActionTypeEnum
import domain.core.productoffer.ProductOffer
import domain.rules.RuleEvent
global domain.core.productoffer.RuleValidationReport validationResult
rule "RequiredVProducts"
when
ProductOfferRuleEvent(id == '3')
ProductOffer(id.value == 31963)
$subscription:Subscription()
not ( SubscribedService(status != ActionTypeEnum.REMOVE_CANCEL
&& productId.value in (57, 69) ) from $subscription.getAllChildSubscribedServices())
then
validationResult.addValidationMessage("2069",
"For product offer rule event with id '3' and product offer with
id=31963 subscription must have one of the following VProducts: 57,
69.");
end
------------------------------------
Regards
Christian Nedregård