deltas: skip if projected delta size is bigger than previous snapshot
authorValentin Gatien-Baron <vgatien-baron@janestreet.com>
Thu, 25 Apr 2019 22:50:33 +0200
changeset 42480 66c27df1be84
parent 42479 a0b26fc8fbba
child 42481 6e9ba867a946
deltas: skip if projected delta size is bigger than previous snapshot Before computing any delta, we get a basic estimation of the delta size we can expect and the resulted compressed value. We then checks this projected size against the `size(snapshotⁿ) > size(snapshotⁿ⁺¹)` constraint. This allows to exclude potential base candidates before doing any expensive computation. This only apply to the intermediate-snapshot case since this constraint only apply to them. For some pathological cases of a private repository this step provide a significant performance boost (timing from `hg perfrevlogwrite`): before: 14.115908 seconds after: 3.145906 seconds
mercurial/revlogutils/deltas.py
--- a/mercurial/revlogutils/deltas.py	Thu Apr 25 22:30:14 2019 +0200
+++ b/mercurial/revlogutils/deltas.py	Thu Apr 25 22:50:33 2019 +0200
@@ -698,6 +698,12 @@
                         # delta lower bound is larger than accepted upper bound
                         continue
 
+                    # check the relative constraint on the delta size
+                    revlength = revlog.length(rev)
+                    if revlength < lowestrealisticdeltalen:
+                        # delta probable lower bound is larger than target base
+                        continue
+
             group.append(rev)
         if group:
             # XXX: in the sparse revlog case, group can become large,