[PATCH 06 of 14] sparse-revlog: stop using a heap to track selected gap

Boris Feld boris.feld at octobus.net
Mon Nov 12 04:55:41 EST 2018


# HG changeset patch
# User Boris Feld <boris.feld at octobus.net>
# Date 1541689636 -3600
#      Thu Nov 08 16:07:16 2018 +0100
# Node ID ddafb271512fc26de60da5dceffc1509bb023d66
# Parent  8ebe5520cc4ae87f6fccba20897d292489a651db
# EXP-Topic sparse-perf
# Available At https://bitbucket.org/octobus/mercurial-devel/
#              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r ddafb271512f
sparse-revlog: stop using a heap to track selected gap

Same logic as for 'gapsheap', we don't actually need a heap.

diff --git a/mercurial/revlogutils/deltas.py b/mercurial/revlogutils/deltas.py
--- a/mercurial/revlogutils/deltas.py
+++ b/mercurial/revlogutils/deltas.py
@@ -10,7 +10,6 @@
 from __future__ import absolute_import
 
 import collections
-import heapq
 import struct
 
 # import stuff from node for others to import from revlog
@@ -296,12 +295,11 @@ def _slicechunktodensity(revlog, revs, t
     gaps.sort()
 
     # Collect the indices of the largest holes until the density is acceptable
-    indicesheap = []
-    heapq.heapify(indicesheap)
+    selected = []
     while gaps and density < targetdensity:
         gapsize, gapidx = gaps.pop()
 
-        heapq.heappush(indicesheap, gapidx)
+        selected.append(gapidx)
 
         # the gap sizes are stored as negatives to be sorted decreasingly
         # by the heap
@@ -310,11 +308,11 @@ def _slicechunktodensity(revlog, revs, t
             density = chainpayload / float(readdata)
         else:
             density = 1.0
+    selected.sort()
 
     # Cut the revs at collected indices
     previdx = 0
-    while indicesheap:
-        idx = heapq.heappop(indicesheap)
+    for idx in selected:
 
         chunk = _trimchunk(revlog, revs, previdx, idx)
         if chunk:


More information about the Mercurial-devel mailing list