Skip to content
  • Jeff King's avatar
    strbuf_getwholeline: use getc_unlocked · 82912d1d
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    strbuf_getwholeline calls getc in a tight loop. On modern
    libc implementations, the stdio code locks the handle for
    every operation, which means we are paying a significant
    overhead.  We can get around this by locking the handle for
    the whole loop and using the unlocked variant.
    
    Running "git rev-parse refs/heads/does-not-exist" on a repo
    with an extremely large (1.6GB) packed-refs file went from:
    
      real    0m18.900s
      user    0m18.472s
      sys     0m0.448s
    
    to:
    
      real    0m10.953s
      user    0m10.384s
      sys     0m0.580s
    
    for a wall-clock speedup of 42%. All times are best-of-3,
    and done on a glibc 2.19 system.
    
    Note that we call into strbuf_grow while holding the lock.
    It's possible for that function to call other stdio
    functions (e.g., printing to stderr when dying due to malloc
    error); however, the POSIX.1-2001 definition of flockfile
    makes it clear that the locks are per-handle, so we are fine
    unless somebody else tries to read from our same handle.
    This doesn't ever happen in the current code, and is
    unlikely to be added in the future (we would have to do
    something exotic like add a die_routine that tried to read
    from stdin).
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    82912d1d