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:

committed by
Junio C Hamano

parent
d9c2bd560e
commit
a6720955f1
@ -695,8 +695,19 @@ static int find_cache_pos(struct traverse_info *info,
|
|||||||
++o->cache_bottom;
|
++o->cache_bottom;
|
||||||
continue;
|
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;
|
continue;
|
||||||
|
}
|
||||||
ce_name = ce->name + pfxlen;
|
ce_name = ce->name + pfxlen;
|
||||||
ce_slash = strchr(ce_name, '/');
|
ce_slash = strchr(ce_name, '/');
|
||||||
if (ce_slash)
|
if (ce_slash)
|
||||||
|
Reference in New Issue
Block a user