1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-23 13:46:09 +02:00

Merge branch 'pw/xdiff-classify-record-in-histogram'

"diff --histogram" optimization.

* pw/xdiff-classify-record-in-histogram:
  xdiff: drop unused flags parameter from recs_match
  xdiff: drop xpparam_t parameter from histogram cmp_recs()
  xdiff: drop CMP_ENV macro from xhistogram
  xdiff: simplify comparison
  xdiff: avoid unnecessary memory allocations
  diff histogram: intern strings
This commit is contained in:
Junio C Hamano 2021-12-21 15:03:14 -08:00
commit a0f5ca94dd
3 changed files with 29 additions and 42 deletions

View File

@ -390,12 +390,9 @@ static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1,
} }
static int recs_match(xrecord_t *rec1, xrecord_t *rec2, long flags) static int recs_match(xrecord_t *rec1, xrecord_t *rec2)
{ {
return (rec1->ha == rec2->ha && return (rec1->ha == rec2->ha);
xdl_recmatch(rec1->ptr, rec1->size,
rec2->ptr, rec2->size,
flags));
} }
/* /*
@ -759,10 +756,10 @@ static inline int group_previous(xdfile_t *xdf, struct xdlgroup *g)
* following group, expand this group to include it. Return 0 on success or -1 * following group, expand this group to include it. Return 0 on success or -1
* if g cannot be slid down. * if g cannot be slid down.
*/ */
static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g, long flags) static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g)
{ {
if (g->end < xdf->nrec && if (g->end < xdf->nrec &&
recs_match(xdf->recs[g->start], xdf->recs[g->end], flags)) { recs_match(xdf->recs[g->start], xdf->recs[g->end])) {
xdf->rchg[g->start++] = 0; xdf->rchg[g->start++] = 0;
xdf->rchg[g->end++] = 1; xdf->rchg[g->end++] = 1;
@ -780,10 +777,10 @@ static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g, long flags)
* into a previous group, expand this group to include it. Return 0 on success * into a previous group, expand this group to include it. Return 0 on success
* or -1 if g cannot be slid up. * or -1 if g cannot be slid up.
*/ */
static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g, long flags) static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g)
{ {
if (g->start > 0 && if (g->start > 0 &&
recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1], flags)) { recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1])) {
xdf->rchg[--g->start] = 1; xdf->rchg[--g->start] = 1;
xdf->rchg[--g->end] = 0; xdf->rchg[--g->end] = 0;
@ -833,7 +830,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
end_matching_other = -1; end_matching_other = -1;
/* Shift the group backward as much as possible: */ /* Shift the group backward as much as possible: */
while (!group_slide_up(xdf, &g, flags)) while (!group_slide_up(xdf, &g))
if (group_previous(xdfo, &go)) if (group_previous(xdfo, &go))
BUG("group sync broken sliding up"); BUG("group sync broken sliding up");
@ -848,7 +845,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
/* Now shift the group forward as far as possible: */ /* Now shift the group forward as far as possible: */
while (1) { while (1) {
if (group_slide_down(xdf, &g, flags)) if (group_slide_down(xdf, &g))
break; break;
if (group_next(xdfo, &go)) if (group_next(xdfo, &go))
BUG("group sync broken sliding down"); BUG("group sync broken sliding down");
@ -875,7 +872,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
* other file that it can align with. * other file that it can align with.
*/ */
while (go.end == go.start) { while (go.end == go.start) {
if (group_slide_up(xdf, &g, flags)) if (group_slide_up(xdf, &g))
BUG("match disappeared"); BUG("match disappeared");
if (group_previous(xdfo, &go)) if (group_previous(xdfo, &go))
BUG("group sync broken sliding to match"); BUG("group sync broken sliding to match");
@ -918,7 +915,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
} }
while (g.end > best_shift) { while (g.end > best_shift) {
if (group_slide_up(xdf, &g, flags)) if (group_slide_up(xdf, &g))
BUG("best shift unreached"); BUG("best shift unreached");
if (group_previous(xdfo, &go)) if (group_previous(xdfo, &go))
BUG("group sync broken sliding to blank line"); BUG("group sync broken sliding to blank line");

View File

@ -88,19 +88,14 @@ struct region {
#define REC(env, s, l) \ #define REC(env, s, l) \
(env->xdf##s.recs[l - 1]) (env->xdf##s.recs[l - 1])
static int cmp_recs(xpparam_t const *xpp, static int cmp_recs(xrecord_t *r1, xrecord_t *r2)
xrecord_t *r1, xrecord_t *r2)
{ {
return r1->ha == r2->ha && return r1->ha == r2->ha;
xdl_recmatch(r1->ptr, r1->size, r2->ptr, r2->size,
xpp->flags);
} }
#define CMP_ENV(xpp, env, s1, l1, s2, l2) \
(cmp_recs(xpp, REC(env, s1, l1), REC(env, s2, l2)))
#define CMP(i, s1, l1, s2, l2) \ #define CMP(i, s1, l1, s2, l2) \
(cmp_recs(i->xpp, REC(i->env, s1, l1), REC(i->env, s2, l2))) (cmp_recs(REC(i->env, s1, l1), REC(i->env, s2, l2)))
#define TABLE_HASH(index, side, line) \ #define TABLE_HASH(index, side, line) \
XDL_HASHLONG((REC(index->env, side, line))->ha, index->table_bits) XDL_HASHLONG((REC(index->env, side, line))->ha, index->table_bits)

View File

@ -181,15 +181,11 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_
if (!(recs = (xrecord_t **) xdl_malloc(narec * sizeof(xrecord_t *)))) if (!(recs = (xrecord_t **) xdl_malloc(narec * sizeof(xrecord_t *))))
goto abort; goto abort;
if (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF) hbits = xdl_hashbits((unsigned int) narec);
hbits = hsize = 0; hsize = 1 << hbits;
else { if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *))))
hbits = xdl_hashbits((unsigned int) narec); goto abort;
hsize = 1 << hbits; memset(rhash, 0, hsize * sizeof(xrecord_t *));
if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *))))
goto abort;
memset(rhash, 0, hsize * sizeof(xrecord_t *));
}
nrec = 0; nrec = 0;
if ((cur = blk = xdl_mmfile_first(mf, &bsize)) != NULL) { if ((cur = blk = xdl_mmfile_first(mf, &bsize)) != NULL) {
@ -208,9 +204,7 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_
crec->size = (long) (cur - prev); crec->size = (long) (cur - prev);
crec->ha = hav; crec->ha = hav;
recs[nrec++] = crec; recs[nrec++] = crec;
if (xdl_classify_record(pass, cf, rhash, hbits, crec) < 0)
if ((XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF) &&
xdl_classify_record(pass, cf, rhash, hbits, crec) < 0)
goto abort; goto abort;
} }
} }
@ -219,10 +213,13 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_
goto abort; goto abort;
memset(rchg, 0, (nrec + 2) * sizeof(char)); memset(rchg, 0, (nrec + 2) * sizeof(char));
if (!(rindex = (long *) xdl_malloc((nrec + 1) * sizeof(long)))) if ((XDF_DIFF_ALG(xpp->flags) != XDF_PATIENCE_DIFF) &&
goto abort; (XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF)) {
if (!(ha = (unsigned long *) xdl_malloc((nrec + 1) * sizeof(unsigned long)))) if (!(rindex = xdl_malloc((nrec + 1) * sizeof(*rindex))))
goto abort; goto abort;
if (!(ha = xdl_malloc((nrec + 1) * sizeof(*ha))))
goto abort;
}
xdf->nrec = nrec; xdf->nrec = nrec;
xdf->recs = recs; xdf->recs = recs;
@ -279,8 +276,7 @@ int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
enl1 = xdl_guess_lines(mf1, sample) + 1; enl1 = xdl_guess_lines(mf1, sample) + 1;
enl2 = xdl_guess_lines(mf2, sample) + 1; enl2 = xdl_guess_lines(mf2, sample) + 1;
if (XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF && if (xdl_init_classifier(&cf, enl1 + enl2 + 1, xpp->flags) < 0)
xdl_init_classifier(&cf, enl1 + enl2 + 1, xpp->flags) < 0)
return -1; return -1;
if (xdl_prepare_ctx(1, mf1, enl1, xpp, &cf, &xe->xdf1) < 0) { if (xdl_prepare_ctx(1, mf1, enl1, xpp, &cf, &xe->xdf1) < 0) {
@ -305,8 +301,7 @@ int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
return -1; return -1;
} }
if (XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF) xdl_free_classifier(&cf);
xdl_free_classifier(&cf);
return 0; return 0;
} }