]> git.ipfire.org Git - thirdparty/git.git/commitdiff
ls-files: use strbuf_add_uint()
authorRené Scharfe <l.s.r@web.de>
Tue, 12 May 2026 11:56:02 +0000 (13:56 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 12 May 2026 15:48:42 +0000 (00:48 +0900)
Speed up printing of objectsize values by using the specialized function
strbuf_add_uint() as well as strbuf_insert() for padding instead of the
general-purpose function strbuf_addf().  Here are the numbers I get when
listing files in the Linux kernel repo:

Benchmark 1: ./git_main -C ../linux ls-files --format='%(objectsize)'
  Time (mean ± σ):     257.3 ms ±   0.4 ms    [User: 197.4 ms, System: 56.7 ms]
  Range (min … max):   256.7 ms … 258.1 ms    11 runs

Benchmark 2: ./git -C ../linux ls-files --format='%(objectsize)'
  Time (mean ± σ):     253.4 ms ±   0.3 ms    [User: 193.6 ms, System: 56.6 ms]
  Range (min … max):   253.0 ms … 253.8 ms    11 runs

Benchmark 3: ./git_main -C ../linux ls-files --format='%(objectsize:padded)'
  Time (mean ± σ):     257.9 ms ±   0.3 ms    [User: 198.0 ms, System: 56.6 ms]
  Range (min … max):   257.3 ms … 258.5 ms    11 runs

Benchmark 4: ./git -C ../linux ls-files --format='%(objectsize:padded)'
  Time (mean ± σ):     254.6 ms ±   1.0 ms    [User: 194.6 ms, System: 56.7 ms]
  Range (min … max):   253.7 ms … 256.8 ms    11 runs

Summary
  ./git -C ../linux ls-files --format='%(objectsize)' ran
    1.00 ± 0.00 times faster than ./git -C ../linux ls-files --format='%(objectsize:padded)'
    1.02 ± 0.00 times faster than ./git_main -C ../linux ls-files --format='%(objectsize)'
    1.02 ± 0.00 times faster than ./git_main -C ../linux ls-files --format='%(objectsize:padded)'

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/ls-files.c

index b148607f7a14684570f4ec78b17282c958776e72..c142ad41562794a272228817e0cc642345e3cff3 100644 (file)
@@ -250,20 +250,23 @@ static void expand_objectsize(struct repository *repo, struct strbuf *line,
                              const struct object_id *oid,
                              const enum object_type type, unsigned int padded)
 {
+       static const char padding[] = "       ";
+       size_t min_len = padded ? strlen(padding) : 0;
+       size_t orig_len = line->len;
+       size_t len;
+
        if (type == OBJ_BLOB) {
                unsigned long size;
                if (odb_read_object_info(repo->objects, oid, &size) < 0)
                        die(_("could not get object info about '%s'"),
                            oid_to_hex(oid));
-               if (padded)
-                       strbuf_addf(line, "%7"PRIuMAX, (uintmax_t)size);
-               else
-                       strbuf_addf(line, "%"PRIuMAX, (uintmax_t)size);
-       } else if (padded) {
-               strbuf_addf(line, "%7s", "-");
+               strbuf_add_uint(line, size);
        } else {
                strbuf_addstr(line, "-");
        }
+       len = line->len - orig_len;
+       if (len < min_len)
+               strbuf_insert(line, orig_len, padding, min_len - len);
 }
 
 static void show_ce_fmt(struct repository *repo, const struct cache_entry *ce,