[jboss-jira] [JBoss JIRA] Commented: (JBRULES-1471) Accumulate should not call getResult() more then necessary
Geoffrey De Smet (JIRA)
jira-events at lists.jboss.org
Sun Feb 17 14:17:26 EST 2008
[ http://jira.jboss.com/jira/browse/JBRULES-1471?page=comments#action_12399677 ]
Geoffrey De Smet commented on JBRULES-1471:
-------------------------------------------
Currently:
- accumulate
- getResults
- accumulate
- getResults
- other restrictions
Mark thinks about putting the result from a from node on the agenda, instead of processing it directly.
That might result in worse performance, for those that use an accumulate as an early restriction of which the other restrictions are expensive to evaluate:
- accumulate -> schedule getResults
- accumulate -> schedule getResults
- other restrictions
- getResults
I've been wondering if it's possible to do a best of both worlds?
Schedule it on the agenda, but before the other restrictions are evaluated:
- accumulate -> schedule getResults
- accumulate -> schedule getResults
- getResults
- other restrictions
Does that look possible to implement?
> Accumulate should not call getResult() more then necessary
> ----------------------------------------------------------
>
> Key: JBRULES-1471
> URL: http://jira.jboss.com/jira/browse/JBRULES-1471
> Project: JBoss Drools
> Issue Type: Task
> Security Level: Public(Everyone can see)
> Components: Reteoo
> Reporter: Geoffrey De Smet
> Assigned To: Edson Tirelli
> Fix For: 5.0.0-M1
>
>
> For this rule:
> rule "roomCapacityTooSmall" // TODO it takes 50-90% of the performance of drools-solver
> when
> $period : Period();
> $room : Room($capacity : capacity);
> $totalStudentSize : Number(intValue > $capacity) from accumulate(
> Exam(period == $period, room == $room, $studentSize : topicStudentSize),
> sum($studentSize)
> );
> ...
> end
> Outside drl, I update 2 out of 700 Exam objects and call fireAllRulesAndCalculateDecisionScore.
> The drl never changes an Exam. Period and Room never change.
> That results into this log:
> Breakpoint reached at org.drools.solver.core.evaluation.EvaluationHandler.fireAllRulesAndCalculateDecisionScore(EvaluationHandler.java:90)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.reverse(SumAccumulateFunction.java:62)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.getResult(SumAccumulateFunction.java:70)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.accumulate(SumAccumulateFunction.java:53)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.getResult(SumAccumulateFunction.java:70)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.reverse(SumAccumulateFunction.java:62)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.getResult(SumAccumulateFunction.java:70)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.accumulate(SumAccumulateFunction.java:53)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.getResult(SumAccumulateFunction.java:70)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.reverse(SumAccumulateFunction.java:62)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.getResult(SumAccumulateFunction.java:70)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.accumulate(SumAccumulateFunction.java:53)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.getResult(SumAccumulateFunction.java:70)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.reverse(SumAccumulateFunction.java:62)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.getResult(SumAccumulateFunction.java:70)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.accumulate(SumAccumulateFunction.java:53)
> Breakpoint reached at org.drools.base.accumulators.SumAccumulateFunction.getResult(SumAccumulateFunction.java:70)
> There are 4 accumulate calls and 4 reverse calls. That might be accurate.
> There are 8 getResult calls, that should only be 1.
> Also, the getResult method creates a new Double instance each time:
> return new Double( data.total );
> It might be better to do
> return Double.valueOf(data.total);
> to allow the JVM to hot spot optimize it.
--
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