deltas: skip if projected compressed size is bigger than previous snapshot
authorValentin Gatien-Baron <vgatien-baron@janestreet.com>
Mon, 21 Jan 2019 22:46:31 +0100
changeset 42484 9b5fbe5ead89
parent 42483 c1c1872d25d1
child 42485 4a3abb33380a
deltas: skip if projected compressed size is bigger than previous snapshot If we have a delta, we check constraints against a lower bound estimate of the resulting compressed delta. 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 further performance boost (timing from `hg perfrevlogwrite`): before: 3.010646 seconds after: 2.609307 seconds
mercurial/revlogutils/deltas.py
--- a/mercurial/revlogutils/deltas.py	Mon Jan 21 22:46:18 2019 +0100
+++ b/mercurial/revlogutils/deltas.py	Mon Jan 21 22:46:31 2019 +0100
@@ -966,6 +966,8 @@
             snapshotlimit = revinfo.textlen >> snapshotdepth
             if snapshotlimit < lowestrealisticdeltalen:
                 return None
+            if revlog.length(base) < lowestrealisticdeltalen:
+                return None
         header, data = revlog.compress(delta)
         deltalen = len(header) + len(data)
         offset = revlog.end(len(revlog) - 1)