There is code in post_read_index_from() to catch out of order entries when reading an index file. This order verification is ~13% of the cost of every call to read_index_from(). Update check_ce_order() so that it skips this verification unless the "verify_ce_order" global variable is set. Teach fsck to force this verification. The effect can be seen using t/perf/p0002-read-cache.sh: Test HEAD HEAD~1 -------------------------------------------------------------------------------------- 0002.1: read_cache/discard_cache 1000 times 0.41(0.04+0.04) 0.50(0.00+0.10) +22.0% Signed-off-by: Ben Peart <benpeart@xxxxxxxxxxxxx> --- Notes: Base Ref: Web-Diff: https://github.com/benpeart/git/commit/54fa9cf954 Checkout: git fetch https://github.com/benpeart/git verify_ce_order-v1 && git checkout 54fa9cf954 builtin/fsck.c | 1 + cache.h | 1 + read-cache.c | 6 ++++++ 3 files changed, 8 insertions(+) diff --git a/builtin/fsck.c b/builtin/fsck.c index d18244ab54..81cc5ad78d 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -763,6 +763,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix) if (keep_cache_objects) { verify_index_checksum = 1; + verify_ce_order = 1; read_cache(); for (i = 0; i < active_nr; i++) { unsigned int mode; diff --git a/cache.h b/cache.h index 5e2c9512ff..4a4f879061 100644 --- a/cache.h +++ b/cache.h @@ -721,6 +721,7 @@ extern int hold_locked_index(struct lock_file *, int); extern void set_alternate_index_output(const char *); extern int verify_index_checksum; +extern int verify_ce_order; /* Environment bits from configuration mechanism */ extern int trust_executable_bit; diff --git a/read-cache.c b/read-cache.c index b64610c400..32743da157 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1513,6 +1513,9 @@ struct ondisk_cache_entry_extended { /* Allow fsck to force verification of the index checksum. */ int verify_index_checksum; +/* Allow fsck to force verification of the cache entry order. */ +int verify_ce_order; + static int verify_hdr(struct cache_header *hdr, unsigned long size) { git_SHA_CTX c; @@ -1698,6 +1701,9 @@ static void check_ce_order(struct index_state *istate) { unsigned int i; + if (!verify_ce_order) + return; + for (i = 1; i < istate->cache_nr; i++) { struct cache_entry *ce = istate->cache[i - 1]; struct cache_entry *next_ce = istate->cache[i]; base-commit: 46309c695b080648f8c0ea5e2d1fd7387ee7f044 -- 2.14.1.windows.1.1034.g0776750557