]> git.ipfire.org Git - thirdparty/git.git/commit
reftable/record: don't try to reallocate ref record name
authorPatrick Steinhardt <ps@pks.im>
Mon, 12 Feb 2024 08:32:53 +0000 (09:32 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 12 Feb 2024 17:18:05 +0000 (09:18 -0800)
commita418a7abef72132eff23e783f80f8c88b3c63266
tree480976285a4c473ffdc75015410f96f1582aa5f7
parent92fa3253c8423815e84be91a2d9a3509df20a646
reftable/record: don't try to reallocate ref record name

When decoding reftable ref records we first release the pointer to the
record passed to us and then use realloc(3P) to allocate the refname
array. This is a bit misleading though as we know at that point that the
refname will always be `NULL`, so we would always end up allocating a
new char array anyway.

Refactor the code to use `REFTABLE_ALLOC_ARRAY()` instead. As the
following benchmark demonstrates this is a tiny bit more efficient. But
the bigger selling point really is the gained clarity.

  Benchmark 1: show-ref: single matching ref (revision = HEAD~)
    Time (mean ± σ):     150.1 ms ±   4.1 ms    [User: 146.6 ms, System: 3.3 ms]
    Range (min … max):   144.5 ms … 180.5 ms    1000 runs

  Benchmark 2: show-ref: single matching ref (revision = HEAD)
    Time (mean ± σ):     148.9 ms ±   4.5 ms    [User: 145.2 ms, System: 3.4 ms]
    Range (min … max):   143.0 ms … 185.4 ms    1000 runs

  Summary
    show-ref: single matching ref (revision = HEAD) ran
      1.01 ± 0.04 times faster than show-ref: single matching ref (revision = HEAD~)

Ideally, we should try and reuse the memory of the old record instead of
first freeing and then immediately reallocating it. This requires some
more surgery though and is thus left for a future iteration.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
reftable/record.c