Date: Sat, 17 Jan 2009 18:57:12 +0000 (UTC) From: David Schultz <das@FreeBSD.org> To: cvs-src-old@freebsd.org Subject: cvs commit: src/lib/libc/stdio vfprintf.c vfwprintf.c Message-ID: <200901171857.n0HIvV5Z012361@repoman.freebsd.org>
index | next in thread | raw e-mail
das 2009-01-17 18:57:12 UTC
FreeBSD src repository
Modified files:
lib/libc/stdio vfprintf.c vfwprintf.c
Log:
SVN rev 187369 on 2009-01-17 18:57:12Z by das
When f[w]printf() is called on an unbuffered file like stdout, it
sets up a fake buffered FILE and then effectively calls itself
recursively. Unfortunately, gcc doesn't know how to do tail call
elimination in this case, and actually makes things worse by
inlining __sbprintf(). This means that f[w]printf() to stderr was
allocating about 5k of stack on 64-bit platforms, much of which was
never used.
I've reorganized things to eliminate the waste. In addition to saving
some stack space, this improves performance in my tests by anywhere
from 5% to 17% (depending on the test) when -fstack-protector is
enabled. I found no statistically significant performance difference
when stack protection is turned off. (The tests redirected stderr to
/dev/null.)
Revision Changes Path
1.86 +12 -7 src/lib/libc/stdio/vfprintf.c
1.37 +11 -7 src/lib/libc/stdio/vfwprintf.c
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200901171857.n0HIvV5Z012361>
