From: Jeff Hostetler Date: Wed, 19 Apr 2017 17:06:16 +0000 (+0000) Subject: read-cache: speed up add_index_entry during checkout X-Git-Tag: v2.13.0-rc1~8^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e5494631ed94017da862d55eb6393a0d01d8b91d;p=thirdparty%2Fgit.git 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 Signed-off-by: Junio C Hamano --- diff --git a/read-cache.c b/read-cache.c index 11823f5dbc..836338b3ba 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1021,7 +1021,16 @@ static int add_index_entry_with_check(struct index_state *istate, struct cache_e if (!(option & ADD_CACHE_KEEP_CACHE_TREE)) cache_tree_invalidate_path(istate, ce->name); - pos = index_name_stage_pos(istate, ce->name, ce_namelen(ce), ce_stage(ce)); + + /* + * If this entry's path sorts after the last entry in the index, + * we can avoid searching for it. + */ + if (istate->cache_nr > 0 && + strcmp(ce->name, istate->cache[istate->cache_nr - 1]->name) > 0) + pos = -istate->cache_nr - 1; + else + pos = index_name_stage_pos(istate, ce->name, ce_namelen(ce), ce_stage(ce)); /* existing match? Just replace it. */ if (pos >= 0) {