Patchwork [2,of,2,V5] delta: reuse _findsnapshot call from previous stage

login
register
mail settings
Submitter Boris Feld
Date Jan. 2, 2019, 11:33 a.m.
Message ID <2508c6c5b3627608ae42.1546428806@Laptop-Boris.lan>
Download mbox | patch
Permalink /patch/37422/
State Superseded
Headers show

Comments

Boris Feld - Jan. 2, 2019, 11:33 a.m.
# HG changeset patch
# User Boris Feld <boris.feld@octobus.net>
# Date 1545297384 -3600
#      Thu Dec 20 10:16:24 2018 +0100
# Node ID 2508c6c5b3627608ae42fae8e632636ced0046ce
# Parent  aef438c9ecdbae3efb5f57f56041109cd5acda39
# EXP-Topic sparse-revlog
# Available At https://bitbucket.org/octobus/mercurial-devel/
#              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r 2508c6c5b362
delta: reuse _findsnapshot call from previous stage

Two different stage of the sparse-revlog logic needs the _findsnapshot data.
To avoid recomputing it twice, make it possible to reuse the first computation
in the second step.

example affected manifest write
before: 0.067141s
after:  0.064252s (-5%)

(total gain since start of series: 95%)

Patch

diff --git a/mercurial/revlogutils/deltas.py b/mercurial/revlogutils/deltas.py
--- a/mercurial/revlogutils/deltas.py
+++ b/mercurial/revlogutils/deltas.py
@@ -713,7 +713,8 @@  def _refinedgroups(revlog, p1, p2, cache
         if good is not None:
             yield None
             return
-    for candidates in _rawgroups(revlog, p1, p2, cachedelta):
+    snapshots = collections.defaultdict(list)
+    for candidates in _rawgroups(revlog, p1, p2, cachedelta, snapshots):
         good = yield candidates
         if good is not None:
             break
@@ -734,12 +735,8 @@  def _refinedgroups(revlog, p1, p2, cache
                 break
             good = yield (base,)
         # refine snapshot up
-        #
-        # XXX the _findsnapshots call can be expensive and is "duplicated" with
-        # the one done in `_rawgroups`. Once we start working on performance,
-        # we should make the two logics share this computation.
-        snapshots = collections.defaultdict(list)
-        _findsnapshots(revlog, snapshots, good + 1)
+        if not snapshots:
+            _findsnapshots(revlog, snapshots, good + 1)
         previous = None
         while good != previous:
             previous = good
@@ -749,7 +746,7 @@  def _refinedgroups(revlog, p1, p2, cache
     # we have found nothing
     yield None
 
-def _rawgroups(revlog, p1, p2, cachedelta):
+def _rawgroups(revlog, p1, p2, cachedelta, snapshots=None):
     """Provides group of revision to be tested as delta base
 
     This lower level function focus on emitting delta theorically interresting
@@ -779,7 +776,9 @@  def _rawgroups(revlog, p1, p2, cachedelt
             yield parents
 
     if sparse and parents:
-        snapshots = collections.defaultdict(list) # map: base-rev: snapshot-rev
+        if snapshots is None:
+            # map: base-rev: snapshot-rev
+            snapshots = collections.defaultdict(list)
         # See if we can use an existing snapshot in the parent chains to use as
         # a base for a new intermediate-snapshot
         #