mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
Revert removal of multi-match discard heuristic in 27af01
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 of27af01d
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@inf.fu-berlin.de> Signed-off-by: René Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Tay Ray Chuan <rctay89@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
27af01d552
commit
c5aa90682f
|
@ -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.
|
* 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) {
|
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;
|
xrecord_t **recs;
|
||||||
xdlclass_t *rcrec;
|
xdlclass_t *rcrec;
|
||||||
char *dis, *dis1, *dis2;
|
char *dis, *dis1, *dis2;
|
||||||
|
@ -411,16 +411,20 @@ static int xdl_cleanup_records(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xd
|
||||||
dis1 = dis;
|
dis1 = dis;
|
||||||
dis2 = dis1 + xdf1->nrec + 1;
|
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++) {
|
for (i = xdf1->dstart, recs = &xdf1->recs[xdf1->dstart]; i <= xdf1->dend; i++, recs++) {
|
||||||
rcrec = cf->rcrecs[(*recs)->ha];
|
rcrec = cf->rcrecs[(*recs)->ha];
|
||||||
nm = rcrec ? rcrec->len2 : 0;
|
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++) {
|
for (i = xdf2->dstart, recs = &xdf2->recs[xdf2->dstart]; i <= xdf2->dend; i++, recs++) {
|
||||||
rcrec = cf->rcrecs[(*recs)->ha];
|
rcrec = cf->rcrecs[(*recs)->ha];
|
||||||
nm = rcrec ? rcrec->len1 : 0;
|
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];
|
for (nreff = 0, i = xdf1->dstart, recs = &xdf1->recs[xdf1->dstart];
|
||||||
|
|
Loading…
Reference in a new issue