зеркало из https://github.com/microsoft/git.git
cache-tree: remove use of strbuf_addf in update_one
String formatting can be a performance issue when there are hundreds of thousands of trees. Change to stop using the strbuf_addf and just add the strings or characters individually. There are a limited number of modes so added a switch for the known ones and a default case if something comes through that are not a known one for git. In one scenario regarding a huge worktree, this reduces the time required for a `git checkout <branch>` from 44 seconds to 38 seconds, i.e. it is a non-negligible performance improvement. Signed-off-by: Kevin Willford <kewillf@microsoft.com>
This commit is contained in:
Родитель
a08cbbe520
Коммит
df2dfe11b0
24
cache-tree.c
24
cache-tree.c
|
@ -423,7 +423,29 @@ static int update_one(struct cache_tree *it,
|
|||
continue;
|
||||
|
||||
strbuf_grow(&buffer, entlen + 100);
|
||||
strbuf_addf(&buffer, "%o %.*s%c", mode, entlen, path + baselen, '\0');
|
||||
|
||||
switch (mode) {
|
||||
case 0100644:
|
||||
strbuf_add(&buffer, "100644 ", 7);
|
||||
break;
|
||||
case 0100664:
|
||||
strbuf_add(&buffer, "100664 ", 7);
|
||||
break;
|
||||
case 0100755:
|
||||
strbuf_add(&buffer, "100755 ", 7);
|
||||
break;
|
||||
case 0120000:
|
||||
strbuf_add(&buffer, "120000 ", 7);
|
||||
break;
|
||||
case 0160000:
|
||||
strbuf_add(&buffer, "160000 ", 7);
|
||||
break;
|
||||
default:
|
||||
strbuf_addf(&buffer, "%o ", mode);
|
||||
break;
|
||||
}
|
||||
strbuf_add(&buffer, path + baselen, entlen);
|
||||
strbuf_addch(&buffer, '\0');
|
||||
strbuf_add(&buffer, oid->hash, the_hash_algo->rawsz);
|
||||
|
||||
#if DEBUG_CACHE_TREE
|
||||
|
|
Загрузка…
Ссылка в новой задаче