See attached project, DroolsBilling.

You can build it with Maven from the project directory: mvn clean package

To run it after building: java -jar target/DroolsBilling-1.0.jar <numRules> <numPhoneNumbersPerThread>

$ java -server -jar target/DroolsBilling-1.0.jar 100 100000
Rules load time: 3482ms
Rules execution time: 732ms, per number: 0.00732ms
Rules execution time: 731ms, per number: 0.00731ms
Rules execution time: 746ms, per number: 0.00746ms
Rules execution time: 760ms, per number: 0.0076ms
Rules execution time: 832ms, per number: 0.00832ms
Rules execution time: 623ms, per number: 0.00623ms
Rules execution time: 600ms, per number: 0.0060ms
Rules execution time: 632ms, per number: 0.00632ms
Rules execution time: 630ms, per number: 0.0063ms
Rules execution time: 607ms, per number: 0.00607ms
DONE!

At higher numbers of rules you have to increase the perm gen and heap memory:

$ java -server -Xmx1024M -XX:MaxPermSize=128M -jar target/DroolsBilling-1.0.jar 10000 100000
Rules load time: 58317ms
Rules execution time: 1580ms, per number: 0.0158ms
Rules execution time: 1580ms, per number: 0.0158ms
Rules execution time: 1586ms, per number: 0.01586ms
Rules execution time: 2493ms, per number: 0.02493ms
Rules execution time: 2502ms, per number: 0.02502ms
Rules execution time: 1360ms, per number: 0.0136ms
Rules execution time: 1358ms, per number: 0.01358ms
Rules execution time: 1376ms, per number: 0.01376ms
Rules execution time: 473ms, per number: 0.00473ms
Rules execution time: 489ms, per number: 0.00489ms
DONE!

As you can see the time to process one phone number is lower than 1 minute. :)  The example uses 5 concurrent threads and was executed on a 4 core machine.

A Sample.drl is included that shows the format of the rules generated, basically this:

rule "PhoneNumber000000000"
when
p : PhoneNumber( digit0 == '0', digit1 == '0', digit2 == '0', digit3 == '0', digit4 == '0', digit5 == '0', digit6 == '0', digit7 == '0', digit8 == '0', digit9 == '0')
then
p.setPrice(0.0);
end

They should be substantially similar to the rules generated behind the decision table you've given, so the performance should be similar.  As you can see from the times above, rule creation is expensive but execution is cheap.  As Mark said, reuse the KnowledgeBase.


--- On Tue, 5/18/10, Antonio Anderson Souza <antonio@voicetechnology.com.br> wrote:

From: Antonio Anderson Souza <antonio@voicetechnology.com.br>
Subject: Re: [rules-users] Jbilling Drools performance
To: "Rules Users List" <rules-users@lists.jboss.org>
Date: Tuesday, May 18, 2010, 4:11 PM

Greg,

CDR is a Call Detail Record, sorry I forgot to explain it, the object is a POJO with the following attributes:

field: name: datereference type: DATE value: 2010-04-28 00:00:00.0
field: name: billingid type: STRING value: 20100428.15544.42adf
field: name: accountid type: INTEGER value: 15544
field: name: billingperiod type: STRING value: 20100401
field: name: billingclassification type: STRING value: DUR
field: name: ipxcallguid type: STRING value: 5k692927-guwtka-g8kj8d0u-1-g8krry54-o4n
field: name: transactiondatetime type: DATE value: 2010-04-28 20:21:01.337
field: name: billingitemid type: INTEGER value: 0
field: name: ratesystem type: STRING value: IPXNET
field: name: originnumber type: STRING value: 551135880520@bitcompany.braste
field: name: destinationnumber type: STRING value: 551139012650
field: name: destinationareaid type: STRING value: 100000551
field: name: chargedduration type: DATE value: 1980-01-01 00:02:06.0
field: name: chargedamount type: FLOAT value: 0.0816
field: name: userid type: INTEGER value: 3372
field: name: username type: STRING value: bitcom51
field: name: unitamount type: FLOAT value: 0.00389
field: name: amountcurrency type: STRING value: USD
field: name: timezone type: INTEGER value: -3
field: name: registertype type: STRING value: MV
field: name: datelastupdated type: DATE value: 2010-04-29 02:57:18.54
field: name: lastupdatedby type: STRING value: IPXRateCalls rev032
field: name: lastupdateremarks type: STRING value: null
field: name: dateinserted type: DATE value: 2010-04-29 02:57:18.54
field: name: destinationdetail type: STRING value: SAO PAULO
field: name: type type: STRING value: Fixo
field: name: collectedcallflag type: INTEGER value: 0
field: name: jb_timestamp type: DATE value: null
field: name: digit0 type: INTEGER value: 5
field: name: digit1 type: INTEGER value: 5
field: name: digit2 type: INTEGER value: 1
field: name: digit3 type: INTEGER value: 1
field: name: digit4 type: INTEGER value: 3
field: name: digit5 type: INTEGER value: 9
field: name: digit6 type: INTEGER value: 0
field: name: digit7 type: INTEGER value: 1
field: name: digit8 type: INTEGER value: 2
field: name: digit9 type: INTEGER value: 6
field: name: digit10 type: INTEGER value: 5
field: name: digit11 type: INTEGER value: 0

This spreadsheet is only a sample because the whole one has 40000 rules, I'm checking the Jbilling code, but it seams to be loading the rules each time.

Best regards,

Antonio Anderson Souza
Voice Technology
http://www.antonioams.com


2010/5/18 Greg Barton <greg_barton@yahoo.com>
OK, so a few questions:

What is a CDR?  How much data does it contain?  Do you load the rules fresh each time you process one?  Are there other rules besides the ones listed in the decision table?