Skip to content

Commit

Permalink
cache-tree: remove use of strbuf_addf in update_one
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Kevin Willford authored and dscho committed Nov 3, 2023
1 parent 380591f commit c516f1b
Showing 1 changed file with 23 additions and 1 deletion.
24 changes: 23 additions & 1 deletion cache-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,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
Expand Down

0 comments on commit c516f1b

Please sign in to comment.