Mercurial > hg
changeset 20073:eeba4eaf0716
revlog: return lazy set from findcommonmissing
When computing the commonmissing, it greedily computes the entire set
immediately. On a large repo where the majority of history is irrelevant, this
causes a significant slow down.
Replacing it with a lazy set makes amend go from 11 seconds to 8.7 seconds.
author | Durham Goode <durham@fb.com> |
---|---|
date | Mon, 11 Nov 2013 16:40:02 -0800 |
parents | 6d4fda48b4e3 |
children | 5fc2ae1c631b |
files | mercurial/revlog.py |
diffstat | 1 files changed, 23 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revlog.py Tue Nov 19 11:29:56 2013 -0500 +++ b/mercurial/revlog.py Mon Nov 11 16:40:02 2013 -0800 @@ -401,7 +401,29 @@ heads = [self.rev(n) for n in heads] # we want the ancestors, but inclusive - has = set(self.ancestors(common)) + class lazyset(object): + def __init__(self, lazyvalues): + self.addedvalues = set() + self.lazyvalues = lazyvalues + + def __contains__(self, value): + return value in self.addedvalues or value in self.lazyvalues + + def __iter__(self): + added = self.addedvalues + for r in added: + yield r + for r in self.lazyvalues: + if not r in added: + yield r + + def add(self, value): + self.addedvalues.add(value) + + def update(self, values): + self.addedvalues.update(values) + + has = lazyset(self.ancestors(common)) has.add(nullrev) has.update(common)