xdiff/xprepare: skip classification
xdiff performs "classification" of records (xdl_classify_record()), replacing hashes (xrecord_t.ha) with a unique identifier of the record/line and building a hash table (xrecord_t.rhash) of records. This is then used to "cleanup" records (xdl_cleanup_records()). We don't need any of that in histogram diff, so we omit calls to these functions. We also skip allocating memory to the hash table, rhash, as it is no longer used. This gives us a small boost in performance. Signed-off-by: Tay Ray Chuan <rctay89@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
8c912eea94
commit
9f37c27593
@ -154,11 +154,15 @@ static int xdl_prepare_ctx(mmfile_t *mf, long narec, xpparam_t const *xpp,
|
|||||||
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 (xpp->flags & XDF_HISTOGRAM_DIFF)
|
||||||
|
hbits = hsize = 0;
|
||||||
|
else {
|
||||||
hbits = xdl_hashbits((unsigned int) narec);
|
hbits = xdl_hashbits((unsigned int) narec);
|
||||||
hsize = 1 << hbits;
|
hsize = 1 << hbits;
|
||||||
if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *))))
|
if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *))))
|
||||||
goto abort;
|
goto abort;
|
||||||
memset(rhash, 0, hsize * sizeof(xrecord_t *));
|
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) {
|
||||||
@ -183,7 +187,8 @@ static int xdl_prepare_ctx(mmfile_t *mf, long narec, xpparam_t const *xpp,
|
|||||||
crec->ha = hav;
|
crec->ha = hav;
|
||||||
recs[nrec++] = crec;
|
recs[nrec++] = crec;
|
||||||
|
|
||||||
if (xdl_classify_record(cf, rhash, hbits, crec) < 0)
|
if (!(xpp->flags & XDF_HISTOGRAM_DIFF) &&
|
||||||
|
xdl_classify_record(cf, rhash, hbits, crec) < 0)
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -240,7 +245,8 @@ int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
|
|||||||
enl1 = xdl_guess_lines(mf1) + 1;
|
enl1 = xdl_guess_lines(mf1) + 1;
|
||||||
enl2 = xdl_guess_lines(mf2) + 1;
|
enl2 = xdl_guess_lines(mf2) + 1;
|
||||||
|
|
||||||
if (xdl_init_classifier(&cf, enl1 + enl2 + 1, xpp->flags) < 0) {
|
if (!(xpp->flags & XDF_HISTOGRAM_DIFF) &&
|
||||||
|
xdl_init_classifier(&cf, enl1 + enl2 + 1, xpp->flags) < 0) {
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -257,9 +263,11 @@ int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(xpp->flags & XDF_HISTOGRAM_DIFF))
|
||||||
xdl_free_classifier(&cf);
|
xdl_free_classifier(&cf);
|
||||||
|
|
||||||
if (!(xpp->flags & XDF_PATIENCE_DIFF) &&
|
if (!(xpp->flags & XDF_PATIENCE_DIFF) &&
|
||||||
|
!(xpp->flags & XDF_HISTOGRAM_DIFF) &&
|
||||||
xdl_optimize_ctxs(&xe->xdf1, &xe->xdf2) < 0) {
|
xdl_optimize_ctxs(&xe->xdf1, &xe->xdf2) < 0) {
|
||||||
|
|
||||||
xdl_free_ctx(&xe->xdf2);
|
xdl_free_ctx(&xe->xdf2);
|
||||||
|
Loading…
Reference in New Issue
Block a user