changeset 25639:7125225a5287

ancestors: prefetch method outside of the loop 15412bba5a68 is yet another example where this is worthwhile when it comes to performance, we blindly do it for all 'lazyancestors' methods.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Wed, 24 Jun 2015 12:37:55 -0500
parents 7fdd1782fc4e
children 39f0064a3079
files mercurial/ancestor.py
diffstat 1 files changed, 7 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/ancestor.py	Sun Sep 28 20:18:43 2014 -0700
+++ b/mercurial/ancestor.py	Wed Jun 24 12:37:55 2015 -0500
@@ -316,11 +316,14 @@
         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):
@@ -337,6 +340,7 @@
         stoprev = self._stoprev
         heappop = heapq.heappop
         heappush = heapq.heappush
+        see = seen.add
 
         targetseen = False
 
@@ -347,7 +351,7 @@
                 # 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