[PATCH] ancestors: prefetch method outside of the loop

Augie Fackler raf at durin42.com
Mon Jun 22 09:18:43 CDT 2015


On Sat, Jun 20, 2015 at 03:29:15PM -0700, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at fb.com>
> # Date 1434766800 25200
> #      Fri Jun 19 19:20:00 2015 -0700
> # Node ID a005a978678ae5bbfdf4cf298af5449db5d7d369
> # Parent  2748bf78a5bf610da4f2d90fd1eea19a3b360c04
> ancestors: prefetch method outside of the loop

Queued with a spurious double-blank-line dropped. Thanks!

>
> 15412bba5a68 is yet another example than this is worthwhile when it comes to
> performance, we blindly do in for all 'lazyancestors' method.
>
> diff --git a/mercurial/ancestor.py b/mercurial/ancestor.py
> --- a/mercurial/ancestor.py
> +++ b/mercurial/ancestor.py
> @@ -310,19 +310,23 @@ class lazyancestors(object):
>          if self._inclusive:
>              for rev in revs:
>                  yield rev
>              seen.update(revs)
>
> +
>          parentrevs = self._parentrevs
>          stoprev = self._stoprev
>          visit = collections.deque(revs)
>
> +        see = seen.add
> +        schedule = visit.append
> +
>          while visit:
>              for parent in parentrevs(visit.popleft()):
>                  if parent >= stoprev and parent not in seen:
> -                    visit.append(parent)
> -                    seen.add(parent)
> +                    schedule(parent)
> +                    see(parent)
>                      yield parent
>
>      def __contains__(self, target):
>          """Test whether target is an ancestor of self._initrevs."""
>          # Trying to do both __iter__ and __contains__ using the same visit
> @@ -335,20 +339,21 @@ class lazyancestors(object):
>          parentrevs = self._parentrevs
>          visit = self._containsvisit
>          stoprev = self._stoprev
>          heappop = heapq.heappop
>          heappush = heapq.heappush
> +        see = seen.add
>
>          targetseen = False
>
>          while visit and -visit[0] > target and not targetseen:
>              for parent in parentrevs(-heappop(visit)):
>                  if parent < stoprev or parent in seen:
>                      continue
>                  # We need to make sure we push all parents into the heap so
>                  # that we leave it in a consistent state for future calls.
>                  heappush(visit, -parent)
> -                seen.add(parent)
> +                see(parent)
>                  if parent == target:
>                      targetseen = True
>
>          return targetseen
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list