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:
Kevin Willford 2017-07-03 13:39:45 -06:00 коммит произвёл Johannes Schindelin
Родитель a08cbbe520
Коммит df2dfe11b0
1 изменённых файлов: 23 добавлений и 1 удалений

Просмотреть файл

@ -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