Uploaded image for project: 'JBRULES'
  1. JBRULES
  2. JBRULES-1471

Accumulate should not call getResult() more then necessary

    XMLWordPrintable

    Details

      Description

      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.

        Attachments

          Activity

            People

            Assignee:
            tirelli Edson Tirelli
            Reporter:
            ge0ffrey Geoffrey De Smet
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Dates

              Created:
              Updated: