Git development
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Karthik Nayak <karthik.188@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 3/3] reftable/stack: avoid reloading the stack when already locked
Date: Thu, 20 Aug 2026 03:53:42 -0400	[thread overview]
Message-ID: <20260820075342.GA2761530@coredump.intra.peff.net> (raw)
In-Reply-To: <20260819-740-optimize-reloading-the-reftable-stack-v1-3-6bf5305d4e43@gmail.com>

On Wed, Aug 19, 2026 at 03:19:39PM +0200, Karthik Nayak wrote:

> Benchmarking with a fixed, non-symbolic target OID shows a modest but
> consistent ~1-2% improvement in clock time for `update-ref` across ref
> counts ranging from 2,000 to 100,000.

Interesting. I get ~25% speedup with this patch, doing this:

  git init --ref-format=reftable
  cp -a .git/reftable reftable.orig
  seq -f "create refs/tags/foo-%g $blob" 50000 >input
  hyperfine -p 'rm -rf .git/reftable; cp -a reftable.orig .git/reftable' \
           -L v old,new \
	   './git.{v} update-ref --stdin <input'

(where git.old and git.new are builds before and after your series).
With 50,000 refs I get:

  Benchmark 1: ./git.old update-ref --stdin <input
    Time (mean ± σ):     125.8 ms ±   4.4 ms    [User: 91.2 ms, System: 34.5 ms]
    Range (min … max):   121.0 ms … 135.2 ms    21 runs
  
  Benchmark 2: ./git.new update-ref --stdin <input
    Time (mean ± σ):     100.4 ms ±   3.1 ms    [User: 90.9 ms, System: 9.4 ms]
    Range (min … max):    95.0 ms … 106.0 ms    29 runs
  
  Summary
    ./git.new update-ref --stdin <input ran
      1.25 ± 0.06 times faster than ./git.old update-ref --stdin <input

And it seems to scale down linearly. With 10,000 it's:

  Benchmark 1: ./git.old update-ref --stdin <input
    Time (mean ± σ):      24.2 ms ±   1.4 ms    [User: 17.1 ms, System: 7.1 ms]
    Range (min … max):    22.6 ms …  32.8 ms    83 runs
  
  Benchmark 2: ./git.new update-ref --stdin <input
    Time (mean ± σ):      19.2 ms ±   1.0 ms    [User: 16.9 ms, System: 2.4 ms]
    Range (min … max):    17.9 ms …  25.8 ms    135 runs
  
  Summary
    ./git.new update-ref --stdin <input ran
      1.26 ± 0.10 times faster than ./git.old update-ref --stdin <input

So 1/5 as much work took 1/5 as much time, but we still saved 25% of the
relative time with the patch.

I'm a little curious why we such get different numbers, but it may not
be worth digging too deep. Avoiding unnecessary syscalls seems worth it
to me regardless, as they can sometimes be more expensive you expect
(say, on a networked filesystem).

-Peff

      parent reply	other threads:[~2026-08-20  7:53 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-19 13:19 [PATCH 0/3] reftable/stack: avoid reloading the stack when locked Karthik Nayak
2026-08-19 13:19 ` [PATCH 1/3] reftable/stack: remove `REFTABLE_STACK_NEW_ADDITION_RELOAD` Karthik Nayak
2026-08-19 16:28   ` Justin Tobler
2026-08-20  5:51   ` Patrick Steinhardt
2026-08-19 13:19 ` [PATCH 2/3] reftable/stack: move list lock to `struct reftable_stack` Karthik Nayak
2026-08-19 16:39   ` Justin Tobler
2026-08-19 17:17   ` Junio C Hamano
2026-08-19 13:19 ` [PATCH 3/3] reftable/stack: avoid reloading the stack when already locked Karthik Nayak
2026-08-19 16:49   ` Justin Tobler
2026-08-20  7:53   ` Jeff King [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260820075342.GA2761530@coredump.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=karthik.188@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox