Skip to content

Commit 8f48b09

Browse files
Kevin Willfordderrickstolee
authored andcommitted
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 <[email protected]>
1 parent 892ddf7 commit 8f48b09

File tree

1 file changed

+23
-1
lines changed

1 file changed

+23
-1
lines changed

cache-tree.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,29 @@ static int update_one(struct cache_tree *it,
398398
continue;
399399

400400
strbuf_grow(&buffer, entlen + 100);
401-
strbuf_addf(&buffer, "%o %.*s%c", mode, entlen, path + baselen, '\0');
401+
402+
switch (mode) {
403+
case 0100644:
404+
strbuf_add(&buffer, "100644 ", 7);
405+
break;
406+
case 0100664:
407+
strbuf_add(&buffer, "100664 ", 7);
408+
break;
409+
case 0100755:
410+
strbuf_add(&buffer, "100755 ", 7);
411+
break;
412+
case 0120000:
413+
strbuf_add(&buffer, "120000 ", 7);
414+
break;
415+
case 0160000:
416+
strbuf_add(&buffer, "160000 ", 7);
417+
break;
418+
default:
419+
strbuf_addf(&buffer, "%o ", mode);
420+
break;
421+
}
422+
strbuf_add(&buffer, path + baselen, entlen);
423+
strbuf_addch(&buffer, '\0');
402424
strbuf_add(&buffer, oid->hash, the_hash_algo->rawsz);
403425

404426
#if DEBUG_CACHE_TREE

0 commit comments

Comments
 (0)