Subject: Re: [PATCH v2] diff-index: don't queue unchanged filepairs with diff_change()

From: Junio C Hamano <[email-masked]>
Date: Sun, 30 Nov 2025 10:02:19 -0800

René Scharfe <[email-masked]> writes:

> Add a new streamlined function for queuing unchanged filepairs and
> use it in show_modified(), which is called by diff_cache() via
> oneway_diff() and do_oneway_diff().  It allocates only a single filespec
> for each filepair and uses it twice with reference counting.  This has a
> measurable effect if there are a lot of them, like in the Linux repo:
>
> Benchmark 1: ./git_v2.52.0 -C ../linux diff --cached --find-copies-harder
>   Time (mean ± σ):      31.8 ms ±   0.2 ms    [User: 24.2 ms, System: 6.3 ms]
>   Range (min … max):    31.5 ms …  32.3 ms    85 runs
>
> Benchmark 2: ./git -C ../linux diff --cached --find-copies-harder
>   Time (mean ± σ):      23.9 ms ±   0.2 ms    [User: 18.1 ms, System: 4.6 ms]
>   Range (min … max):    23.5 ms …  24.4 ms    111 runs
>
> Summary
>   ./git -C ../linux diff --cached --find-copies-harder ran
>     1.33 ± 0.01 times faster than ./git_v2.52.0 -C ../linux diff --cached --find-copies-harder

Nice.  Is this technique only applicable to diff-index among the
three diff plumbing siblings?  I suspect diff-files is an oddball
in that on the working tree side we do not necessarily have the
blob object names, but it would apply to diff-tree, wouldn't it?

Will queue.  Thanks.