# HG changeset patch # User Durham Goode # Date 1384216802 28800 # Node ID eeba4eaf0716842f48beec32148b60ed17885500 # Parent 6d4fda48b4e3710cfc2161f676adb46c424079d3 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. diff -r 6d4fda48b4e3 -r eeba4eaf0716 mercurial/revlog.py --- 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)