[PATCH 4 of 5] revset: prefetch an attribute in _generatorset.__iter__

Augie Fackler raf at durin42.com
Wed Sep 24 10:28:01 CDT 2014


On Fri, Sep 19, 2014 at 03:33:57PM -0700, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at fb.com>
> # Date 1411080765 25200
> #      Thu Sep 18 15:52:45 2014 -0700
> # Node ID bfaab5271eb80fd282784864193e0d57a1ceef89
> # Parent  a2b305e889547516d7952ee8ecd67948cd8ff360
> revset: prefetch an attribute in _generatorset.__iter__
>
> Python's attribute lookup are expensible, lets do less of them.
>
> This gives us a 7% speedup on this revset iteration (from 0.063403 to 0.059032)
>
> diff --git a/mercurial/revset.py b/mercurial/revset.py
> --- a/mercurial/revset.py
> +++ b/mercurial/revset.py
> @@ -2655,16 +2655,17 @@ class _generatorset(object):
>          #
>          # Getting ride of it would provide an about 15% speed up on this
>          # iteration.
>          i = 0
>          genlist = self._genlist
> -        consume = self._consumegen()
> +        nextrev = self._consumegen().next
> +        _len = len # cache global lookup

Did this really make a difference? The caching of the __builtin__, I
mean (caching nextrev is obviously going to save some time.)

>          while True:
> -            if i < len(genlist):
> +            if i < _len(genlist):
>                  yield genlist[i]
>              else:
> -                yield consume.next()
> +                yield nextrev()
>              i += 1
>
>      def _consumegen(self):
>          cache = self._cache
>          genlist = self._genlist.append
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list