Mercurial > hg
comparison mercurial/revlog.py @ 40152:adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
While reviewing the Rust implementation, I noticed iter(ancestors) doesn't
need to check filtering state for each parent revision. And doing that appears
to have some measurable perf win.
$ hg perfancestors -R mercurial
(orig) wall 0.038093 comb 0.040000 user 0.040000 sys 0.000000 (best of 100)
(this) wall 0.024795 comb 0.020000 user 0.020000 sys 0.000000 (best of 117)
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Fri, 12 Oct 2018 06:22:43 +0200 |
parents | 324b4b10351e |
children | ba70e3acf58a |
comparison
equal
deleted
inserted
replaced
40151:38ac525b44c9 | 40152:adbf8ca239e4 |
---|---|
646 raise error.WdirUnsupported | 646 raise error.WdirUnsupported |
647 raise | 647 raise |
648 | 648 |
649 return entry[5], entry[6] | 649 return entry[5], entry[6] |
650 | 650 |
651 # fast parentrevs(rev) where rev isn't filtered | |
652 _uncheckedparentrevs = parentrevs | |
653 | |
651 def node(self, rev): | 654 def node(self, rev): |
652 try: | 655 try: |
653 return self.index[rev][7] | 656 return self.index[rev][7] |
654 except IndexError: | 657 except IndexError: |
655 if rev == wdirrev: | 658 if rev == wdirrev: |
745 """Generate the ancestors of 'revs' in reverse topological order. | 748 """Generate the ancestors of 'revs' in reverse topological order. |
746 Does not generate revs lower than stoprev. | 749 Does not generate revs lower than stoprev. |
747 | 750 |
748 See the documentation for ancestor.lazyancestors for more details.""" | 751 See the documentation for ancestor.lazyancestors for more details.""" |
749 | 752 |
750 return ancestor.lazyancestors(self.parentrevs, revs, stoprev=stoprev, | 753 # first, make sure start revisions aren't filtered |
751 inclusive=inclusive) | 754 revs = list(revs) |
755 checkrev = self.node | |
756 for r in revs: | |
757 checkrev(r) | |
758 # and we're sure ancestors aren't filtered as well | |
759 return ancestor.lazyancestors(self._uncheckedparentrevs, revs, | |
760 stoprev=stoprev, inclusive=inclusive) | |
752 | 761 |
753 def descendants(self, revs): | 762 def descendants(self, revs): |
754 return dagop.descendantrevs(revs, self.revs, self.parentrevs) | 763 return dagop.descendantrevs(revs, self.revs, self.parentrevs) |
755 | 764 |
756 def findcommonmissing(self, common=None, heads=None): | 765 def findcommonmissing(self, common=None, heads=None): |