surprising, as the normal advice is to avoid predicates. However, in that case, the predicate is inside the "column", and there is plenty of filtering done before the predicate test is executed - and the predicate is self is very very simple and cheap, so its probably not suprising, a much simpler rule/network means faster in that case.
Just goes to show, make no assumptions ! I think in that case, the predicate version also looks clearer with its intent (we just need some nicer syntax for it which we will have soon). Michael. On 12/29/06, Peter Lin <[EMAIL PROTECTED]> wrote:
as a general rule, joins are more expensive than predicate constraints and simple literal constraints. think of it this way, it's like doing a sql query on 1 table, vs doing a join on several tables. peter On 12/29/06, Geoffrey De Smet <[EMAIL PROTECTED]> wrote: > > I have 2 alternatives of writing my rules, > here is a cutout (see below for all the rules *): > > A) With predicates > > query "matchRepeater" > Match($homeTeam : homeTeam, $awayTeam : awayTeam, $day1 : day); > Match(homeTeam == $awayTeam, awayTeam == $homeTeam, > $day2 : day -> ($day2.getIndex() == $day1.getIndex() + 1)); > end > > B) With separate facts > > query "matchRepeater" > $day1 : Day($index1 : index); > $day2 : Day($index2 : index -> ($index2 == $index1 + 1)); > Match($homeTeam : homeTeam, $awayTeam : awayTeam, day == $day1); > Match(homeTeam == $awayTeam, awayTeam == $homeTeam, day == $day2); > end > > > Now, I was expecting B to be faster, because A uses predicates which > aren't indexed. Or I was expecting them to be equally fast. > > However, using the trunk version of today I 've recorded this benchmark: > > nl10, 100 iterations: > A = 3m 02s > B = 3m 45s > Using a trunk version of a few weeks ago I had this: > nl6, 1500 iterations: > A = 10m 10s > B = 11m 33s > > In both cases, A is faster the B, which surprises me. > What could be causing this? > > Performance and scalability is the only issue when trying to break the > traveling tournament problem records, so understanding how to write > faster rules is important to me :) > > -- > With kind regards, > Geoffrey De Smet > > > > > > * All the rules: > > A) > query "fourConsecutiveHomeMatches" > Match($homeTeam : homeTeam, $day1 : day); > Match(homeTeam == $homeTeam, $day2 : day -> ($day2.getIndex() == > $day1.getIndex() + 1)); > Match(homeTeam == $homeTeam, $day3 : day -> ($day3.getIndex() == > $day1.getIndex() + 2)); > Match(homeTeam == $homeTeam, $day4 : day -> ($day4.getIndex() == > $day1.getIndex() + 3)); > end > > query "fourConsecutiveAwayMatches" > Match($awayTeam : awayTeam, $day1 : day); > Match(awayTeam == $awayTeam, $day2 : day -> ($day2.getIndex() == > $day1.getIndex() + 1)); > Match(awayTeam == $awayTeam, $day3 : day -> ($day3.getIndex() == > $day1.getIndex() + 2)); > Match(awayTeam == $awayTeam, $day4 : day -> ($day4.getIndex() == > $day1.getIndex() + 3)); > end > > query "matchRepeater" > Match($homeTeam : homeTeam, $awayTeam : awayTeam, $day1 : day); > Match(homeTeam == $awayTeam, awayTeam == $homeTeam, $day2 : day -> > ($day2.getIndex() == $day1.getIndex() + 1)); > end > > B) > > query "fourConsecutiveHomeMatches" > $day1 : Day($index1 : index); > $day2 : Day($index2 : index -> ($index2 == $index1 + 1)); > $day3 : Day($index2 : index -> ($index2 == $index1 + 2)); > $day4 : Day($index2 : index -> ($index2 == $index1 + 3)); > Match($homeTeam : homeTeam, day == $day1); > Match(homeTeam == $homeTeam, day == $day2); > Match(homeTeam == $homeTeam, day == $day3); > Match(homeTeam == $homeTeam, day == $day4); > end > > query "fourConsecutiveAwayMatches" > $day1 : Day($index1 : index); > $day2 : Day($index2 : index -> ($index2 == $index1 + 1)); > $day3 : Day($index2 : index -> ($index2 == $index1 + 2)); > $day4 : Day($index2 : index -> ($index2 == $index1 + 3)); > Match($awayTeam : awayTeam, day == $day1); > Match(awayTeam == $awayTeam, day == $day2); > Match(awayTeam == $awayTeam, day == $day3); > Match(awayTeam == $awayTeam, day == $day4); > end > > query "matchRepeater" > $day1 : Day($index1 : index); > $day2 : Day($index2 : index -> ($index2 == $index1 + 1)); > Match($homeTeam : homeTeam, $awayTeam : awayTeam, day == $day1); > Match(homeTeam == $awayTeam, awayTeam == $homeTeam, day == $day2); > end > > > --------------------------------------------------------------------- > To unsubscribe from this list please visit: > > http://xircles.codehaus.org/manage_email > >
