revset: speed up existence checks for ordered filtered sets
Previously, calling 'if foo:' on a ordered filtered set would start iterating in
whatever the current direction was and return if a value was available. If the
current direction was ascending, but the set had a fastdesc available, this
meant we did a lot more work than necessary.
If this was applied without my previous max/min fixes, it would improve max()
performance (this was my first attempt at fixing the issue). Since those
previous fixes went in though, this doesn't have a visible benefit in the
benchmarks, but it does seem clearly better than it was before so I think it
should still go in.
--- a/mercurial/revset.py Sun Sep 20 19:27:53 2015 -0700
+++ b/mercurial/revset.py Sun Sep 20 16:53:42 2015 -0700
@@ -3225,7 +3225,12 @@
return lambda: self._iterfilter(it())
def __nonzero__(self):
- for r in self:
+ it = self
+ fast = self.fastasc or self.fastdesc
+ if fast:
+ it = fast()
+
+ for r in it:
return True
return False