diff mercurial/revlog.py @ 323:c6f0673ab7e9

lazyparser speed ups -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 lazyparser speed ups When we do __contains__ on a map, we might as well load the whole index. Not doing this was slowing down finding new changesets quite by a factor of 20. When we do a full load, we also attempt to replace the revlog's index and nodemap with normal Python objects to avoid the lazymap overhead. manifest hash: 9b2b20aacc508f9027d115426c63a381d28e5485 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCreYIywK+sNU5EO8RAoNHAJ9+LmXqsTQb9Bh3mZHq0A0VfQOleQCffHmn jC/O0vnfx5FCRsX2bUFG794= =BDTz -----END PGP SIGNATURE-----
author mpm@selenic.com
date Mon, 13 Jun 2005 12:01:12 -0800
parents f06a4a3b86a7
children 27d08c0c2a7e
line wrap: on
line diff
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -43,17 +43,28 @@ nullid = "\0" * 20
 indexformat = ">4l20s20s20s"
 
 class lazyparser:
-    def __init__(self, data):
+    def __init__(self, data, revlog):
         self.data = data
         self.s = struct.calcsize(indexformat)
         self.l = len(data)/self.s
         self.index = [None] * self.l
         self.map = {nullid: -1}
+        self.all = 0
+        self.revlog = revlog
 
-    def load(self, pos):
-        block = pos / 1000
-        i = block * 1000
-        end = min(self.l, i + 1000)
+    def load(self, pos=None):
+        if self.all: return
+        if pos is not None:
+            block = pos / 1000
+            i = block * 1000
+            end = min(self.l, i + 1000)
+        else:
+            self.all = 1
+            i = 0
+            end = self.l
+            self.revlog.index = self.index
+            self.revlog.nodemap = self.map
+            
         while i < end:
             d = self.data[i * self.s: (i + 1) * self.s]
             e = struct.unpack(indexformat, d)
@@ -78,16 +89,14 @@ class lazymap:
     def __init__(self, parser):
         self.p = parser
     def load(self, key):
+        if self.p.all: return
         n = self.p.data.find(key)
         if n < 0: raise KeyError("node " + hex(key))
         pos = n / self.p.s
         self.p.load(pos)
     def __contains__(self, key):
-        try:
-            self[key]
-            return True
-        except KeyError:
-            return False
+        self.p.load()
+        return key in self.p.map
     def __iter__(self):
         for i in xrange(self.p.l):
             try:
@@ -121,7 +130,7 @@ class revlog:
 
         if len(i) > 10000:
             # big index, let's parse it on demand
-            parser = lazyparser(i)
+            parser = lazyparser(i, self)
             self.index = lazyindex(parser)
             self.nodemap = lazymap(parser)
         else: