# HG changeset patch # User Boris Feld # Date 2018-11-08 15:01:30 # Node ID 54de23400b2a14f5811e3e8e88fc543daf6155d4 # Parent bfbfd15d65bd862d596af7154ef29f1321b4cfa1 sparse-revlog: stop using a heap to track gaps The heap doesn't bring any performance advantage as we can simply sort the final list. Moreover, the lesser complexity helps a lot when we later implement it in C. diff --git a/mercurial/revlogutils/deltas.py b/mercurial/revlogutils/deltas.py --- a/mercurial/revlogutils/deltas.py +++ b/mercurial/revlogutils/deltas.py @@ -275,8 +275,7 @@ def _slicechunktodensity(revlog, revs, t return # Store the gaps in a heap to have them sorted by decreasing size - gapsheap = [] - heapq.heapify(gapsheap) + gaps = [] prevend = None for i, rev in enumerate(revs): revstart = start(rev) @@ -290,21 +289,23 @@ def _slicechunktodensity(revlog, revs, t gapsize = revstart - prevend # only consider holes that are large enough if gapsize > mingapsize: - heapq.heappush(gapsheap, (-gapsize, i)) + gaps.append((gapsize, i)) prevend = revstart + revlen + # sort the gaps to pop them from largest to small + gaps.sort() # Collect the indices of the largest holes until the density is acceptable indicesheap = [] heapq.heapify(indicesheap) - while gapsheap and density < targetdensity: - oppgapsize, gapidx = heapq.heappop(gapsheap) + while gaps and density < targetdensity: + gapsize, gapidx = gaps.pop() heapq.heappush(indicesheap, gapidx) # the gap sizes are stored as negatives to be sorted decreasingly # by the heap - readdata -= (-oppgapsize) + readdata -= gapsize if readdata > 0: density = chainpayload / float(readdata) else: