Re: [PATCH 03/10] xdiff: don't waste time guessing the number of lines
- From
- Phillip Wood <phillip.wood123@gmail.com>
- Date
- Jan 20, 2026, 15:02 UTC
- Message-ID
- <208da094-8a5d-4f16-b42b-5d5204576b5f@gmail.com>
- In-Reply-To
- <53e4840c1653772379dc8d5c883b34717b81ac43.1767379944.git.gitgitgadget@gmail.com>
On 02/01/2026 18:52, Ezekiel Newren via GitGitGadget wrote:
> From: Ezekiel Newren <ezekielnewren@gmail.com> > > All lines must be read anyway, so classify them after they're read in. > Also move the memset() into xdl_init_classifier().
So instead of looping over the input lines one and a bit times (the bit being from xdl_guess_lines) we now loop over them twice as we split them first and then classify them in a separate loop. It does save some work not to call xdl_guess_lines but it is unclear if that offsets classifying them in a separate loop.
> + for (size_t i = 0; i < xe->xdf1.nrec; i++) {
> + xrecord_t *rec = &xe->xdf1.recs[i];
> + xdl_classify_record(1, &cf, rec);We seem to have lost the error handling if xdl_classify_record() fails.
Thanks
Phillip
Show 51 quoted lines
> + }
> +
> + for (size_t i = 0; i < xe->xdf2.nrec; i++) {
> + xrecord_t *rec = &xe->xdf2.recs[i];
> + xdl_classify_record(2, &cf, rec);
> }
>
> if ((XDF_DIFF_ALG(xpp->flags) != XDF_PATIENCE_DIFF) &&
> diff --git a/xdiff/xutils.c b/xdiff/xutils.c
> index 77ee1ad9c8..b3d51197c1 100644
> --- a/xdiff/xutils.c
> +++ b/xdiff/xutils.c
> @@ -118,26 +118,6 @@ void *xdl_cha_alloc(chastore_t *cha) {
> return data;
> }
>
> -long xdl_guess_lines(mmfile_t *mf, long sample) {
> - long nl = 0, size, tsize = 0;
> - char const *data, *cur, *top;
> -
> - if ((cur = data = xdl_mmfile_first(mf, &size))) {
> - for (top = data + size; nl < sample && cur < top; ) {
> - nl++;
> - if (!(cur = memchr(cur, '\n', top - cur)))
> - cur = top;
> - else
> - cur++;
> - }
> - tsize += (long) (cur - data);
> - }
> -
> - if (nl && tsize)
> - nl = xdl_mmfile_size(mf) / (tsize / nl);
> -
> - return nl + 1;
> -}
>
> int xdl_blankline(const char *line, long size, long flags)
> {
> diff --git a/xdiff/xutils.h b/xdiff/xutils.h
> index 615b4a9d35..d800840dd0 100644
> --- a/xdiff/xutils.h
> +++ b/xdiff/xutils.h
> @@ -31,7 +31,6 @@ int xdl_emit_diffrec(char const *rec, long size, char const *pre, long psize,
> int xdl_cha_init(chastore_t *cha, long isize, long icount);
> void xdl_cha_free(chastore_t *cha);
> void *xdl_cha_alloc(chastore_t *cha);
> -long xdl_guess_lines(mmfile_t *mf, long sample);
> int xdl_blankline(const char *line, long size, long flags);
> int xdl_recmatch(const char *l1, long s1, const char *l2, long s2, long flags);
> uint64_t xdl_hash_record_verbatim(uint8_t const **data, uint8_t const *top);