revlog: minor chunk speed-up

This commit is contained in:
Matt Mackall 2007-07-26 12:02:58 -05:00
parent d106fa8150
commit eeb8f14a99

View File

@ -509,7 +509,7 @@ class revlog(object):
def parentrevs(self, rev): def parentrevs(self, rev):
return self.index[rev][5:7] return self.index[rev][5:7]
def start(self, rev): def start(self, rev):
return getoffset(self.index[rev][0]) return int(self.index[rev][0] >> 16)
def end(self, rev): def end(self, rev):
return self.start(rev) + self.length(rev) return self.start(rev) + self.length(rev)
def length(self, rev): def length(self, rev):
@ -845,12 +845,7 @@ class revlog(object):
return hash(text, p1, p2) != node return hash(text, p1, p2) != node
def chunk(self, rev, df=None): def chunk(self, rev, df=None):
start, length = self.start(rev), self.length(rev)
if self._inline:
start += (rev + 1) * self._io.size
end = start + length
def loadcache(df): def loadcache(df):
cache_length = max(65536, length)
if not df: if not df:
if self._inline: if self._inline:
df = self.opener(self.indexfile) df = self.opener(self.indexfile)
@ -859,21 +854,29 @@ class revlog(object):
df.seek(start) df.seek(start)
self._chunkcache = (start, df.read(cache_length)) self._chunkcache = (start, df.read(cache_length))
if not self._chunkcache: start, length = self.start(rev), self.length(rev)
loadcache(df) if self._inline:
start += (rev + 1) * self._io.size
end = start + length
cache_start = self._chunkcache[0] offset = 0
cache_end = cache_start + len(self._chunkcache[1]) if not self._chunkcache:
if start >= cache_start and end <= cache_end: cache_length = max(65536, length)
# it is cached
offset = start - cache_start
else:
loadcache(df) loadcache(df)
offset = 0 else:
cache_start = self._chunkcache[0]
cache_length = len(self._chunkcache[1])
cache_end = cache_start + cache_length
if start >= cache_start and end <= cache_end:
# it is cached
offset = start - cache_start
else:
cache_length = max(65536, length)
loadcache(df)
# avoid copying large chunks # avoid copying large chunks
c = self._chunkcache[1] c = self._chunkcache[1]
if len(c) > length: if cache_length != length:
c = c[offset:offset + length] c = c[offset:offset + length]
return decompress(c) return decompress(c)