preload-index: avoid lstat for skip-worktree items
authorJeff Hostetler <jeffhost@microsoft.com>
Fri, 10 Feb 2017 15:10:39 +0000 (16:10 +0100)
committerJunio C Hamano <gitster@pobox.com>
Fri, 10 Feb 2017 22:44:18 +0000 (14:44 -0800)
commite596acc23a8c92784349da613502626d758215b2
tree1e4fb0e5beb5d2a89e9c027d7c30ca1c4250a97f
parent3b9e3c2cede15057af3ff8076c45ad5f33829436
preload-index: avoid lstat for skip-worktree items

Teach preload-index to avoid lstat() calls for index-entries
with skip-worktree bit set.  This is a performance optimization.

During a sparse-checkout, the skip-worktree bit is set on items
that were not populated and therefore are not present in the
worktree.  The per-thread preload-index loop performs a series
of tests on each index-entry as it attempts to compare the
worktree version with the index and mark them up-to-date.
This patch short-cuts that work.

On a Windows 10 system with a very large repo (450MB index)
and various levels of sparseness, performance was improved
in the {preloadindex=true, fscache=false} case by 80% and
in the {preloadindex=true, fscache=true} case by 20% for various
commands.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
preload-index.c