unpack-trees: fix accidentally quadratic behavior
While unpacking trees (e.g. during git checkout), when we hit a cache entry that's past and outside our path, we cut off iteration. This provides about a 45% speedup on git checkout between master and master^20000 on Twitter's monorepo. Speedup in general will depend on repostitory structure, number of changes, and packfile packing decisions. Signed-off-by: David Turner <dturner@twopensource.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
d9c2bd560e
commit
a6720955f1
@ -695,8 +695,19 @@ static int find_cache_pos(struct traverse_info *info,
|
||||
++o->cache_bottom;
|
||||
continue;
|
||||
}
|
||||
if (!ce_in_traverse_path(ce, info))
|
||||
if (!ce_in_traverse_path(ce, info)) {
|
||||
/*
|
||||
* Check if we can skip future cache checks
|
||||
* (because we're already past all possible
|
||||
* entries in the traverse path).
|
||||
*/
|
||||
if (info->traverse_path) {
|
||||
if (strncmp(ce->name, info->traverse_path,
|
||||
info->pathlen) > 0)
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
ce_name = ce->name + pfxlen;
|
||||
ce_slash = strchr(ce_name, '/');
|
||||
if (ce_slash)
|
||||
|
Loading…
Reference in New Issue
Block a user