# HG changeset patch # User Mads Kiilerich <mad...@unity3d.com> # Date 1479322051 -3600 # Wed Nov 16 19:47:31 2016 +0100 # Node ID 851a14d5b80639efe61bd01ad215479c99106b40 # Parent 7f39bccc1c96bffc83f3c6e774da57ecd38982a7 bdiff: early pruning of common suffix before doing expensive computations
Similar to the previous change, but trimming trailing lines. On mozilla-unified: perfbdiff -m 3041e4d59df2 ! wall 0.024618 comb 0.020000 user 0.020000 sys 0.000000 (best of 116) to ! wall 0.008259 comb 0.010000 user 0.010000 sys 0.000000 (best of 356) to perfbdiff 0e9928989e9c --alldata --count 10 ! wall 0.579235 comb 0.580000 user 0.580000 sys 0.000000 (best of 18) ! wall 0.469869 comb 0.460000 user 0.460000 sys 0.000000 (best of 22) diff --git a/mercurial/bdiff_module.c b/mercurial/bdiff_module.c --- a/mercurial/bdiff_module.c +++ b/mercurial/bdiff_module.c @@ -66,7 +66,7 @@ static PyObject *bdiff(PyObject *self, P struct bdiff_line *al, *bl; struct bdiff_hunk l, *h; int an, bn, count; - Py_ssize_t len = 0, la, lb, li = 0, lcommon = 0, lmax; + Py_ssize_t len = 0, la, lb, li = 0, lcommon = 0, lcommonend = 0, lmax; PyThreadState *_save; l.next = NULL; @@ -88,9 +88,16 @@ static PyObject *bdiff(PyObject *self, P if (*ia == '\n') lcommon = li + 1; /* we can almost add: if (li == lmax) lcommon = li; */ + lmax -= lcommon; + for (li = 0, ia = sa + la - 1, ib = sb + lb - 1; + li <= lmax && *ia == *ib; + ++li, --ia, --ib) + if (*ia == '\n') + lcommonend = li; + /* printf("common %i %i\n", lcommon, lcommonend); */ - an = bdiff_splitlines(sa + lcommon, la - lcommon, &al); - bn = bdiff_splitlines(sb + lcommon, lb - lcommon, &bl); + an = bdiff_splitlines(sa + lcommon, la - lcommon - lcommonend, &al); + bn = bdiff_splitlines(sb + lcommon, lb - lcommon - lcommonend, &bl); if (!al || !bl) goto nomem; diff --git a/tests/test-bdiff.py.out b/tests/test-bdiff.py.out --- a/tests/test-bdiff.py.out +++ b/tests/test-bdiff.py.out @@ -28,9 +28,9 @@ showdiff( 'x\n\nx\n\ny\n\nx\n\ny\n\nx\n\nz\n'): 'x\n\nx\n\n' 6 6 '' -> 'y\n\n' - 'x\n\n' - 9 9 '' -> 'y\n\n' - 'x\n\nz\n' + 'x\n' + 8 8 '' -> '\ny\n' + '\nx\n\nz\n' showdiff( 'a\nb\nb\nb\nc\n.\nd\ne\n.\nf\n', 'a\nb\nb\na\nb\nb\nb\nc\n.\nb\nc\n.\nd\ne\nf\n'): diff --git a/tests/test-check-code.t b/tests/test-check-code.t --- a/tests/test-check-code.t +++ b/tests/test-check-code.t @@ -15,10 +15,6 @@ New errors are not allowed. Warnings are Skipping hgext/fsmonitor/pywatchman/msc_stdint.h it has no-che?k-code (glob) Skipping hgext/fsmonitor/pywatchman/pybser.py it has no-che?k-code (glob) Skipping i18n/polib.py it has no-che?k-code (glob) - mercurial/bdiff_module.c:89: - > //printf("common prefix: %i next line: %i\n", li, llf); - don't use //-style comments Skipping mercurial/httpclient/__init__.py it has no-che?k-code (glob) Skipping mercurial/httpclient/_readers.py it has no-che?k-code (glob) Skipping mercurial/statprof.py it has no-che?k-code (glob) - [1] _______________________________________________ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel