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

Accumulate should not call getResult() more then necessary

This issue belongs to an archived project. You can view it, but you can't modify it. Learn more

    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

            etirelli@redhat.com Edson Tirelli
            gdesmet@redhat.com Geoffrey De Smet (Inactive)
            Archiver:
            rhn-support-ceverson Clark Everson

            Dates

              Created:
              Updated:
              Archived:

              PagerDuty