read-cache: speed up add_index_entry during checkout

Teach add_index_entry_with_check() to see if the path of the new item is greater than the last path in the index array before attempting to search for it. During checkout, merge_working_tree() populates the new index in sorted order, so this change will save a binary lookups per file. This preserves the original behavior but simply checks the last element before starting the search. This helps performance on very large repositories. Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff Hostetler committed Apr 19, 2017 at 17:06 UTC e5494631ed94017da862d55eb6393a0d01d8b91d
1 file changed +10 -1
read-cache.c
+10 -1
@@ -1021,7 +1021,16 @@ static int add_index_entry_with_check(struct index_state *istate, struct cache_e
1021
1022 if (!(option & ADD_CACHE_KEEP_CACHE_TREE))
1023 cache_tree_invalidate_path(istate, ce->name);
1024 - pos = index_name_stage_pos(istate, ce->name, ce_namelen(ce), ce_stage(ce));
1024 +
1025 + /*
1026 + * If this entry's path sorts after the last entry in the index,
1027 + * we can avoid searching for it.
1028 + */
1029 + if (istate->cache_nr > 0 &&
1030 + strcmp(ce->name, istate->cache[istate->cache_nr - 1]->name) > 0)
1031 + pos = -istate->cache_nr - 1;
1032 + else
1033 + pos = index_name_stage_pos(istate, ce->name, ce_namelen(ce), ce_stage(ce));
1034
1035 /* existing match? Just replace it. */
1036 if (pos >= 0) {