Am 25.09.2011 15:39, schrieb Tay Ray Chuan: > From: René Scharfe <rene.scharfe@xxxxxxxxxxxxxx> > > 27af01d (xdiff/xprepare: improve O(n*m) performance in > xdl_cleanup_records(), 2011-08-17) was supposed to be a performance > boost only. However, it unexpectedly changed the behaviour of diff. > > Revert a part of 27af01d that removes logic that mark lines as > "multi-match" (ie. dis[i] == 2). This was preventing the multi-match > discard heuristic (performed in xdl_cleanup_records() and > xdl_clean_mmatch()) from executing. > > Reported-by: Alexander Pepper <pepper@xxxxxxxxxxxxxxxx> > Signed-off-by: Tay Ray Chuan <rctay89@xxxxxxxxx> > > --- > > Junio, this replaces the patch the one in the > 'rs/diff-cleanup-records-fix' topic in 'pu'. The only difference is in > the patch message. > > René, will need your SOB on this. Thanks for working to produce the > patch. Please disregard my earlier message [1], further reading has > shown my previous understanding to be wrong. Signed-off-by: Rene Scharfe <rene.scharfe@xxxxxxxxxxxxxx> > > [1] <CALUzUxprUFGMR-WVEMOOvYiwkev1cfxHOyBmZq9bKJcHq5E2VA@xxxxxxxxxxxxxx> > --- > xdiff/xprepare.c | 10 +++++++--- > 1 files changed, 7 insertions(+), 3 deletions(-) > > diff --git a/xdiff/xprepare.c b/xdiff/xprepare.c > index 05a8f01..4c447ca 100644 > --- a/xdiff/xprepare.c > +++ b/xdiff/xprepare.c > @@ -398,7 +398,7 @@ static int xdl_clean_mmatch(char const *dis, long i, long s, long e) { > * might be potentially discarded if they happear in a run of discardable. > */ > static int xdl_cleanup_records(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xdf2) { > - long i, nm, nreff; > + long i, nm, nreff, mlim; > xrecord_t **recs; > xdlclass_t *rcrec; > char *dis, *dis1, *dis2; > @@ -411,16 +411,20 @@ static int xdl_cleanup_records(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xd > dis1 = dis; > dis2 = dis1 + xdf1->nrec + 1; > > + if ((mlim = xdl_bogosqrt(xdf1->nrec)) > XDL_MAX_EQLIMIT) > + mlim = XDL_MAX_EQLIMIT; > for (i = xdf1->dstart, recs = &xdf1->recs[xdf1->dstart]; i <= xdf1->dend; i++, recs++) { > rcrec = cf->rcrecs[(*recs)->ha]; > nm = rcrec ? rcrec->len2 : 0; > - dis1[i] = (nm == 0) ? 0: 1; > + dis1[i] = (nm == 0) ? 0: (nm >= mlim) ? 2: 1; > } > > + if ((mlim = xdl_bogosqrt(xdf2->nrec)) > XDL_MAX_EQLIMIT) > + mlim = XDL_MAX_EQLIMIT; > for (i = xdf2->dstart, recs = &xdf2->recs[xdf2->dstart]; i <= xdf2->dend; i++, recs++) { > rcrec = cf->rcrecs[(*recs)->ha]; > nm = rcrec ? rcrec->len1 : 0; > - dis2[i] = (nm == 0) ? 0: 1; > + dis2[i] = (nm == 0) ? 0: (nm >= mlim) ? 2: 1; > } > > for (nreff = 0, i = xdf1->dstart, recs = &xdf1->recs[xdf1->dstart]; -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html