Mercurial > hg-stable
changeset 42483:c1c1872d25d1
deltas: skip if projected compressed size does not match text size constraint
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 constraints. 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.145906 seconds
after: 3.010646 seconds
author | Valentin Gatien-Baron <vgatien-baron@janestreet.com> |
---|---|
date | Mon, 21 Jan 2019 22:46:18 +0100 |
parents | 465f2d0df9ae |
children | 9b5fbe5ead89 |
files | mercurial/revlogutils/deltas.py |
diffstat | 1 files changed, 6 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revlogutils/deltas.py Mon Jan 21 22:37:30 2019 +0100 +++ b/mercurial/revlogutils/deltas.py Mon Jan 21 22:46:18 2019 +0100 @@ -960,6 +960,12 @@ delta = revinfo.cachedelta[1] if delta is None: delta = self._builddeltadiff(base, revinfo, fh) + # snapshotdept need to be neither None nor 0 level snapshot + if revlog.upperboundcomp is not None and snapshotdepth: + lowestrealisticdeltalen = len(delta) // revlog.upperboundcomp + snapshotlimit = revinfo.textlen >> snapshotdepth + if snapshotlimit < lowestrealisticdeltalen: + return None header, data = revlog.compress(delta) deltalen = len(header) + len(data) offset = revlog.end(len(revlog) - 1)