Re: Performance improvements for src/port/snprintf.c

Andres Freund <andres@anarazel.de>

From: Andres Freund <andres@anarazel.de>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: pgsql-hackers@lists.postgresql.org, Thomas Munro <thomas.munro@enterprisedb.com>, Andrew Gierth <andrew@tao11.riddles.org.uk>, Alexander Kuzmenkov <a.kuzmenkov@postgrespro.ru>
Date: 2018-10-05T16:58:19Z
Lists: pgsql-hackers
Hi,

On 2018-10-05 11:54:59 -0400, Tom Lane wrote:
> Andres Freund <andres@anarazel.de> writes:
> > [ let's use strfromd ]
> 
> So I'm having second thoughts about this, based on the fact that
> strfromd() in't strictly a glibc-ism but is defined in an ISO/IEC
> standard.  That means that we can expect to see it start showing up
> on other platforms (though a quick search did not find any evidence
> that it has yet).  And that means that we'd better consider
> quality-of-implementation issues.  We know that glibc's version is
> fractionally faster than using sprintf with "%.*g", but what are
> the odds that that will be true universally?  I don't have a warm
> feeling about it, given that strfromd's API isn't a very good impedance
> match to what we really need.
> 
> I really think that what we ought to do is apply the float[48]out hack
> I showed in <30551.1538517271@sss.pgh.pa.us> and call it good, at least
> till such time as somebody wants to propose a full-on reimplementation of
> float output.  I don't want to buy back into having platform dependencies
> in this area after having just expended a lot of sweat to get rid of them.

I'm not convinced. Because of some hypothetical platform that may
introduce strfromd() in a broken/slower manner, but where sprintf() is
correct, we should not do the minimal work to alleviate an actual
performance bottleneck in a trivial manner on linux? Our most widely
used platform?  If we find a platform where it's borked, we could just
add a small hack into their platform template file.

Greetings,

Andres Freund


Commits

  1. Improve snprintf.c's handling of NaN, Infinity, and minus zero.

  2. Rationalize snprintf.c's handling of "ll" formats.

  3. Provide fast path in snprintf.c for conversion specs that are just "%s".

  4. Make assorted performance improvements in snprintf.c.

  5. Set snprintf.c's maximum number of NL arguments to be 31.

  6. Always use our own versions of *printf().