maps: cache hashes() for the revmap

This fix caches the hashes() results for revision map. For big
repos the revision map can be huge (>30MB) and this fix is saving us
some time (~0.7s per every subsequent call) by avoiding reversing rev
dictionary multiple times.
This commit is contained in:
Mateusz Kwapich 2014-12-12 16:32:34 -08:00
parent d57229b8c9
commit 6af72e2e62

View File

@ -194,6 +194,7 @@ class RevMap(dict):
def __init__(self, meta):
dict.__init__(self)
self.meta = meta
self._hashes = None
if os.path.isfile(self.meta.revmap_file):
self._load()
@ -201,7 +202,9 @@ class RevMap(dict):
self._write()
def hashes(self):
return dict((v, k) for (k, v) in self.iteritems())
if self._hashes is None:
self._hashes = dict((v, k) for (k, v) in self.iteritems())
return self._hashes
def branchedits(self, branch, rev):
check = lambda x: x[0][1] == branch and x[0][0] < rev.revnum
@ -256,6 +259,8 @@ class RevMap(dict):
if revnum < self.meta.firstpulled or not self.meta.firstpulled:
self.meta.firstpulled = revnum
dict.__setitem__(self, (revnum, branch), ha)
if self._hashes is not None:
self._hashes[ha] = (revnum, branch)
class FileMap(object):