[PATCH STABLE] commit: increase perf by avoiding unnecessary filteredrevs check
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Sat Nov 17 07:27:28 CST 2012
On 17 nov. 2012, at 00:40, Durham Goode wrote:
> # HG changeset patch
> # User Durham Goode <durham at fb.com>
> # Date 1353109152 28800
> # Node ID 270338011eff9c88433e9cced0ba4a1c424b3d4a
> # Parent adca8ebf288c9ed00166298f3be192747d889b82
> commit: increase perf by avoiding unnecessary filteredrevs check
>
> When commiting to a repo with lots of history (>400000 changesets)
> the filteredrevs check (added with 5c89e7fa5bc2) in changelog.py
> takes a bit of time even if the filteredrevs set is empty. Skipping
> the check in that case shaves 0.36 seconds off a 2.14 second commit.
> A 17% gain.
>
> diff --git a/mercurial/changelog.py b/mercurial/changelog.py
> --- a/mercurial/changelog.py
> +++ b/mercurial/changelog.py
> @@ -134,9 +134,15 @@
>
> def __iter__(self):
> """filtered version of revlog.__iter__"""
> - for i in xrange(len(self)):
> - if i not in self.filteredrevs:
> - yield i
> + if len(self.filteredrevs) == 0:
> + return revlog.revlog.__iter__(self)
> +
> + def filterediter():
> + for i in xrange(len(self)):
> + if i not in self.filteredrevs:
> + yield i
> +
> + return filterediter()
could be much simpler:
irevs = revlog.revlog.__iter__(self)
filtered = self.filteredrevs
if filteredrevs:
irevs = (i for i in irevs of i not in filtered)
return irevs
More information about the Mercurial-devel
mailing list