# HG changeset patch # User Boris Feld # Date 1541498663 -3600 # Node ID 914079ee3334fa550042622d701159253aff4301 # Parent cf3bef7f162b05cbe5abdbc8f675eab00b73fba7 perf: teach perfrevlogrevision about sparse reading Before this change, chunks were always read in a single block. Even in the sparse-read/sparse-revlog case. This gave a false view of the performance and could lead to memory consumption issue. diff -r cf3bef7f162b -r 914079ee3334 contrib/perf.py --- a/contrib/perf.py Tue Nov 06 11:13:31 2018 +0100 +++ b/contrib/perf.py Tue Nov 06 11:04:23 2018 +0100 @@ -1723,17 +1723,18 @@ inline = r._inline iosize = r._io.size buffer = util.buffer - offset = start(chain[0]) chunks = [] ladd = chunks.append - - for rev in chain: - chunkstart = start(rev) - if inline: - chunkstart += (rev + 1) * iosize - chunklength = length(rev) - ladd(buffer(data, chunkstart - offset, chunklength)) + for idx, item in enumerate(chain): + offset = start(item[0]) + bits = data[idx] + for rev in item: + chunkstart = start(rev) + if inline: + chunkstart += (rev + 1) * iosize + chunklength = length(rev) + ladd(buffer(bits, chunkstart - offset, chunklength)) return chunks @@ -1745,7 +1746,8 @@ def doread(chain): if not cache: r.clearcaches() - segmentforrevs(chain[0], chain[-1]) + for item in slicedchain: + segmentforrevs(item[0], item[-1]) def dorawchunks(data, chain): if not cache: @@ -1772,9 +1774,19 @@ r.clearcaches() r.revision(node) + try: + from mercurial.revlogutils.deltas import slicechunk + except ImportError: + slicechunk = getattr(revlog, '_slicechunk', None) + + size = r.length(rev) chain = r._deltachain(rev)[0] - data = segmentforrevs(chain[0], chain[-1])[1] - rawchunks = getrawchunks(data, chain) + if not getattr(r, '_withsparseread', False): + slicedchain = (chain,) + else: + slicedchain = tuple(slicechunk(r, chain, targetsize=size)) + data = [segmentforrevs(seg[0], seg[-1])[1] for seg in slicedchain] + rawchunks = getrawchunks(data, slicedchain) bins = r._chunks(chain) text = bytes(bins[0]) bins = bins[1:] @@ -1784,7 +1796,7 @@ (lambda: dorevision(), b'full'), (lambda: dodeltachain(rev), b'deltachain'), (lambda: doread(chain), b'read'), - (lambda: dorawchunks(data, chain), b'rawchunks'), + (lambda: dorawchunks(data, slicedchain), b'rawchunks'), (lambda: dodecompress(rawchunks), b'decompress'), (lambda: dopatch(text, bins), b'patch'), (lambda: dohash(text), b'hash'),