Am 10.08.2017 um 20:47 schrieb Kevin Willford: > 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. > > Signed-off-by: Kevin Willford <kewillf@xxxxxxxxxxxxx> > --- > cache-tree.c | 24 +++++++++++++++++++++++- > 1 file changed, 23 insertions(+), 1 deletion(-) > > diff --git a/cache-tree.c b/cache-tree.c > index 2440d1dc89..41744b3db7 100644 > --- a/cache-tree.c > +++ b/cache-tree.c > @@ -390,7 +390,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; You can avoid specifying the string length by using strbuf_addstr. The compiler can determine that value; the resulting object code should be the same with -O2. > + default: > + strbuf_addf(&buffer, "%o ", mode); > + break; > + } > + strbuf_add(&buffer, path + baselen, entlen); > + strbuf_addch(&buffer, '\0'); How much of the performance improvement is due to these two (especially %.*s)? Looking forward to the perf script to find out myself. :) > strbuf_add(&buffer, sha1, 20); > > #if DEBUG >