Re: [RFC] cocci: .buf in a strbuf object can never be NULL
- From
Jeff King <peff@peff.net>
- Date
- Mar 20, 2026, 06:18 UTC
- Message-ID
- <20260320061852.GA35538@coredump.intra.peff.net>
- In-Reply-To
- <20260320055709.GA35291@coredump.intra.peff.net>
On Fri, Mar 20, 2026 at 01:57:09AM -0400, Jeff King wrote:
> I haven't measured to see what the exact cost is, but I know that > looping over a strbuf (with a reset in the loop, or the implied reset > from a getline call) is a common optimization trick that does have a > measurable improvement for some cases.
Try something like this:
# input file is all objects in linux.git cd linux.git git repack -ad git show-index <.git/objects/pack/pack-*.idx | cut -d' ' -f2 >input
# now do something that primarily reads a bunch of lines git cat-file --buffer --batch-check='%(objectname)" <input
That's a somewhat silly command, though it does do something useful (it checks that each object exists). Here is master ("git.old") versus applying your patch ("git.new"):
Benchmark 1: ./git.old cat-file --buffer --batch-check="%(objectname)" <input
Time (mean ± σ): 3.152 s ± 0.057 s [User: 3.067 s, System: 0.085 s]
Range (min … max): 3.048 s … 3.225 s 10 runs
Benchmark 2: ./git.new cat-file --buffer --batch-check="%(objectname)" <input
Time (mean ± σ): 3.377 s ± 0.065 s [User: 3.295 s, System: 0.082 s]
Range (min … max): 3.279 s … 3.480 s 10 runs
Summary
./git.old cat-file --buffer --batch-check="%(objectname)" <input ran
1.07 ± 0.03 times faster than ./git.new cat-file --buffer --batch-check="%(objectname)" <inputThat's a fairly extreme example, but I think shows that the extra allocations do have measurable overhead. If you ask it do more work (asking for %(objecttype) or something) the relative change becomes smaller, but the absolute slowdown (a few hundred ms) remains.
-Peff