# HG changeset patch # User Valentin Gatien-Baron # Date 2019-04-25 20:50:33 # Node ID 66c27df1be84b1bf0524a7660468bae360012866 # Parent a0b26fc8fbba272ad9f9788fe8c3ec05c024ad1e 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 diff --git a/mercurial/revlogutils/deltas.py b/mercurial/revlogutils/deltas.py --- a/mercurial/revlogutils/deltas.py +++ b/mercurial/revlogutils/deltas.py @@ -698,6 +698,12 @@ def _candidategroups(revlog, textlen, p1 # 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,