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>
Tay Ray Chuan committed
Jul 12, 2011 at 14:10 UTC
9f37c275938e1fbca7165872dad039874add09cd
1 file changed
+16
-8
xdiff/xprepare.c
+16
-8
@@ -154,11 +154,15 @@ static int xdl_prepare_ctx(mmfile_t *mf, long narec, xpparam_t const *xpp,
154
if (!(recs = (xrecord_t **) xdl_malloc(narec * sizeof(xrecord_t *))))
155
goto abort;
156
157
- hbits = xdl_hashbits((unsigned int) narec);
158
- hsize = 1 << hbits;
159
- if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *))))
160
- goto abort;
161
- memset(rhash, 0, hsize * sizeof(xrecord_t *));
157
+ if (xpp->flags & XDF_HISTOGRAM_DIFF)
158
+ hbits = hsize = 0;
159
+ else {
160
+ hbits = xdl_hashbits((unsigned int) narec);
161
+ hsize = 1 << hbits;
162
+ if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *))))
163
+ goto abort;
164
+ memset(rhash, 0, hsize * sizeof(xrecord_t *));
165
+ }
166
167
nrec = 0;
168
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,
187
crec->ha = hav;
188
recs[nrec++] = crec;
189
186
- if (xdl_classify_record(cf, rhash, hbits, crec) < 0)
190
+ if (!(xpp->flags & XDF_HISTOGRAM_DIFF) &&
191
+ xdl_classify_record(cf, rhash, hbits, crec) < 0)
192
goto abort;
193
}
194
}
@@ -240,7 +245,8 @@ int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
245
enl1 = xdl_guess_lines(mf1) + 1;
246
enl2 = xdl_guess_lines(mf2) + 1;
247
243
- if (xdl_init_classifier(&cf, enl1 + enl2 + 1, xpp->flags) < 0) {
248
+ if (!(xpp->flags & XDF_HISTOGRAM_DIFF) &&
249
+ xdl_init_classifier(&cf, enl1 + enl2 + 1, xpp->flags) < 0) {
250
251
return -1;
252
}
@@ -257,9 +263,11 @@ int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
263
return -1;
264
}
265
260
- xdl_free_classifier(&cf);
266
+ if (!(xpp->flags & XDF_HISTOGRAM_DIFF))
267
+ xdl_free_classifier(&cf);
268
269
if (!(xpp->flags & XDF_PATIENCE_DIFF) &&
270
+ !(xpp->flags & XDF_HISTOGRAM_DIFF) &&
271
xdl_optimize_ctxs(&xe->xdf1, &xe->xdf2) < 0) {
272
273
xdl_free_ctx(&xe->xdf2);