]> git.99rst.org Git - git.git/commit
unpack-trees: avoid quadratic index scan in next_cache_entry()
authorHenrique Ferreiro <redacted>
Wed, 8 Jul 2026 21:42:13 +0000 (21:42 +0000)
committerJunio C Hamano <redacted>
Wed, 8 Jul 2026 21:54:21 +0000 (14:54 -0700)
commit716766765c945c9ca62f24f6debc3f255ff3b6a6
tree2e40b15ec583f3ab5b029297f241e6342ef28e03
parent67ad42147a7acc2af6074753ebd03d904476118f
unpack-trees: avoid quadratic index scan in next_cache_entry()

Diffing the working tree against a commit with a pathspec can take
time quadratic in the size of the index when the pathspec matches a
subtree whose entries are the first entries of the index.  Fix it by
having next_cache_entry() record how far it scanned in cache_bottom,
so repeated calls no longer rescan the growing prefix of
already-unpacked entries.  On a Chromium checkout (~500k index
entries),

git diff HEAD -- .agents/OWNERS

took about 8 minutes before this change and 0.07 seconds after it.
The same diff without the commit, without the pathspec, or with
--cached was already instant.

Add p0009-diff-pathspec.sh, which builds a 10,000-entry index whose
first path lives in a subtree (100,000 entries under --long-tests),
to guard against the regression.  Comparing v2.55.0 with this change
using GIT_TEST_LONG=t:

Test                            v2.55.0           HEAD
------------------------------------------------------------------------
0009.2: diff pathspec subtree   7.16(7.12+0.01)   0.02(0.01+0.00) -99.7%

Signed-off-by: Henrique Ferreiro <redacted>
Signed-off-by: Junio C Hamano <redacted>
t/perf/p0009-diff-pathspec.sh [new file with mode: 0755]
unpack-trees.c
git clone https://git.99rst.org/PROJECT