[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