So I tried this "query from scratch each time" experiment:
query "hardConstraintsBroken"
constraintOccurrence : IntConstraintOccurrence(constraintType ==
ConstraintType.NEGATIVE_HARD)
end
query "softConstraintsBroken"
constraintOccurrence : IntConstraintOccurrence(constraintType ==
ConstraintType.NEGATIVE_SOFT)
end
With this java code:
int hard = 0;
QueryResults results =
workingMemory.getQueryResults("hardConstraintsBroken");
for (QueryResult result : results) {
IntConstraintOccurrence constraintOccurrence =
(IntConstraintOccurrence) result.get("constraintOccurrence");
hard += constraintOccurrence.getWeight();
}
int soft = 0;
results = workingMemory.getQueryResults("softConstraintsBroken");
for (QueryResult result : results) {
IntConstraintOccurrence constraintOccurrence =
(IntConstraintOccurrence) result.get("constraintOccurrence");
soft += constraintOccurrence.getWeight();
}
That takes 118s.
So it's clearly faster than the merged rule DRL!
It's not faster than the original accumulate DRL.
- original DRL: 71s
- query from scratch each time: 118s
- merged rule DRL: 172s
So calculating everything from scratch each time (and fetching it from
the QueryResult Map) is faster than using 2 accumulate.
With kind regards,
Geoffrey De Smet
Geoffrey De Smet schreef:
Hi guys,
I've run some experiments on the DRL's used in the drools solver
examination example to see how the DRL affects performance.
In one experiment, I merged 2 rules into 1 rule:
I changed this DRL part of examinationScoreRules.drl:
rule "hardConstraintsBroken"
salience -1
when
$hardTotal : Number() from accumulate(
IntConstraintOccurrence(constraintType ==
ConstraintType.NEGATIVE_HARD, $weight : weight),
sum($weight)
);
then
scoreCalculator.setHardConstraintsBroken($hardTotal.intValue());
end
rule "softConstraintsBroken"
salience -1
when
$softTotal : Number() from accumulate(
IntConstraintOccurrence(constraintType ==
ConstraintType.NEGATIVE_SOFT, $weight : weight),
sum($weight)
);
then
scoreCalculator.setSoftConstraintsBroken($softTotal.intValue());
end
into this DRL part:
rule "constraintsBroken"
salience -1
when
$hardTotal : Number() from accumulate(
IntConstraintOccurrence(constraintType ==
ConstraintType.NEGATIVE_HARD, $weight : weight),
sum($weight)
);
$softTotal : Number() from accumulate(
IntConstraintOccurrence(constraintType ==
ConstraintType.NEGATIVE_SOFT, $weight : weight),
sum($weight)
);
then
scoreCalculator.setHardConstraintsBroken($hardTotal.intValue());
scoreCalculator.setSoftConstraintsBroken($softTotal.intValue());
end
Now the performance for a 100 steps when from 71s to 172s, so it more
then doubled.
All other code stayed the same and the output (except for the times) is
exactly the same.
What can explain this loss in performance?