On Thu, Apr 16, 2015 at 5:01 AM, Jeff King <peff@xxxxxxxx> wrote: > 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. > [...] > > Based on a patch from Rasmus Villemoes <rv@xxxxxxxxxxxxxxxxxx>. > > Signed-off-by: Jeff King <peff@xxxxxxxx> > --- > If somebody has a FreeBSD or OS X system to test on, I'd > love to see what is needed to compile with HAVE_GETDELIM > there. Modern Mac OS X, 10.10.x Yosemite, has getdelim() and git builds fine with HAVE_GETDELIM. I also tested on old Snow Leopard 10.5.8 from 2009. It does not have getdelim(). Unfortunately, I haven't been able to determine when getdelim() was introduced on the Mac OS X, thus have been unable to craft a simple rule for config.mak.uname. > And to confirm that the performance is much better. > Sharing my 1.6GB packed-refs file would be hard, but you > should be able to generate something large and ridiculous. > I'll leave that as an exercise to the reader. > > diff --git a/Makefile b/Makefile > index 5f3987f..36655d5 100644 > --- a/Makefile > +++ b/Makefile > @@ -359,6 +359,8 @@ all:: > # compiler is detected to support it. > # > # Define HAVE_BSD_SYSCTL if your platform has a BSD-compatible sysctl function. > +# > +# Define HAVE_GETDELIM if your system has the getdelim() function. > > GIT-VERSION-FILE: FORCE > @$(SHELL_PATH) ./GIT-VERSION-GEN > @@ -1437,6 +1439,10 @@ ifdef HAVE_BSD_SYSCTL > BASIC_CFLAGS += -DHAVE_BSD_SYSCTL > endif > > +ifdef HAVE_GETDELIM > + BASIC_CFLAGS += -DHAVE_GETDELIM > +endif > + > ifeq ($(TCLTK_PATH),) > NO_TCLTK = NoThanks > endif > diff --git a/config.mak.uname b/config.mak.uname > index f4e77cb..d26665f 100644 > --- a/config.mak.uname > +++ b/config.mak.uname > @@ -36,6 +36,7 @@ ifeq ($(uname_S),Linux) > HAVE_DEV_TTY = YesPlease > HAVE_CLOCK_GETTIME = YesPlease > HAVE_CLOCK_MONOTONIC = YesPlease > + HAVE_GETDELIM = YesPlease > endif > ifeq ($(uname_S),GNU/kFreeBSD) > HAVE_ALLOCA_H = YesPlease -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html