]> granicus.if.org Git - postgresql/commit
Make assorted performance improvements in snprintf.c.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 3 Oct 2018 14:18:15 +0000 (10:18 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 3 Oct 2018 14:18:15 +0000 (10:18 -0400)
commitabd9ca377d669a6e0560e854d7e987438d0e612e
tree26ff0086736a801c8be7d15bad9d1a6894116ebf
parent9bc9f72b28fe4d2c22244f3443af8f1b98b56474
Make assorted performance improvements in snprintf.c.

In combination, these changes make our version of snprintf as fast
or faster than most platforms' native snprintf, except for cases
involving floating-point conversion (which we still delegate to
the native sprintf).  The speed penalty for a float conversion
is down to around 10% though, much better than before.

Notable changes:

* Rather than always parsing the format twice to see if it contains
instances of %n$, do the extra scan only if we actually find a $.
This obviously wins for non-localized formats, and even when there
is use of %n$, we can avoid scanning text before the first % twice.

* Use strchrnul() if available to find the next %, and emit the
literal text between % escapes as strings rather than char-by-char.

* Create a bespoke function (dopr_outchmulti) for the common case
of emitting N copies of the same character, in place of writing
loops around dopr_outch.

* Simplify construction of the format string for invocations of sprintf
for floats.

* Const-ify some internal functions, and avoid unnecessary use of
pass-by-reference arguments.

Patch by me, reviewed by Andres Freund

Discussion: https://postgr.es/m/11787.1534530779@sss.pgh.pa.us
configure
configure.in
src/include/pg_config.h.in
src/include/pg_config.h.win32
src/port/snprintf.c