Skip to content
  • Jeff King's avatar
    strbuf_getwholeline: use getdelim if it is available · 0cc30e0e
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    We spend a lot of time in strbuf_getwholeline in a tight
    loop reading characters from a stdio handle into a buffer.
    The libc getdelim() function can do this for us with less
    overhead. It's in POSIX.1-2008, and was a GNU extension
    before that. Therefore we can't rely on it, but can fall
    back to the existing getc loop when it is not available.
    
    The HAVE_GETDELIM knob is turned on automatically for Linux,
    where we have glibc. We don't need to set any new
    feature-test macros, because we already define _GNU_SOURCE.
    Other systems that implement getdelim may need to other
    macros (probably _POSIX_C_SOURCE >= 200809L), but we can
    address that along with setting the Makefile knob after
    testing the feature on those systems.
    
    Running "git rev-parse refs/heads/does-not-exist" on a repo
    with an extremely large (1.6GB) packed-refs file went from
    (best-of-5):
    
      real    0m8.601s
      user    0m8.084s
      sys     0m0.524s
    
    to:
    
      real    0m6.768s
      user    0m6.340s
      sys     0m0.432s
    
    for a wall-clock speedup of 21%.
    
    Based on a patch from Rasmus Villemoes <rv@rasmusvillemoes.dk>.
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    0cc30e0e