[PATCH v3 7/8] reftable/merged: really reuse buffers to compute record keys
- From
Patrick Steinhardt <ps@pks.im>
- Date
- Jan 3, 2024, 06:22 UTC
- Message-ID
- <845dec239019886575ba6796f34b0181c78981de.1704262787.git.ps@pks.im>
- In-Reply-To
- <cover.1704262787.git.ps@pks.im>
In 829231dc20 (reftable/merged: reuse buffer to compute record keys, 2023-12-11), we have refactored the merged iterator to reuse a pair of long-living strbufs by relying on the fact that `reftable_record_key()` tries to reuse already allocated strbufs by calling `strbuf_reset()`, which should give us significantly fewer reallocations compared to the old code that used on-stack strbufs that are allocated for each and every iteration. Unfortunately, we called `strbuf_release()` on these long-living strbufs that we meant to reuse on each iteration, defeating the optimization.
Fix this performance issue by not releasing those buffers on iteration anymore, where we instead rely on `merged_iter_close()` to release the buffers for us.
Using `git show-ref --quiet` in a repository with ~350k refs this leads to a significant drop in allocations. Before:
HEAP SUMMARY:
in use at exit: 21,163 bytes in 193 blocks
total heap usage: 1,410,148 allocs, 1,409,955 frees, 61,976,068 bytes allocatedAfter:
HEAP SUMMARY:
in use at exit: 21,163 bytes in 193 blocks
total heap usage: 708,058 allocs, 707,865 frees, 36,783,255 bytes allocatedSigned-off-by: Patrick Steinhardt <ps@pks.im> --- reftable/merged.c | 2 -- 1 file changed, 2 deletions(-)
diff --git a/reftable/merged.c b/reftable/merged.c index 556bb5c556..a28bb99aaf 100644 --- a/reftable/merged.c +++ b/reftable/merged.c @@ -128,8 +128,6 @@ static int merged_iter_next_entry(struct merged_iter *mi, done: reftable_record_release(&entry.rec); - strbuf_release(&mi->entry_key); - strbuf_release(&mi->key); return err; }
-- 2.43.GIT