diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2018-10-03 13:05:01 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2018-10-03 13:05:01 -0400 |
commit | 6d842be6c11887930a0f4128fd6aa4de427cfd2a (patch) | |
tree | 81846676d12c8eef74ce60e25197ccac756a9b7f | |
parent | abd9ca377d669a6e0560e854d7e987438d0e612e (diff) | |
download | postgresql-6d842be6c11887930a0f4128fd6aa4de427cfd2a.tar.gz postgresql-6d842be6c11887930a0f4128fd6aa4de427cfd2a.zip |
Provide fast path in snprintf.c for conversion specs that are just "%s".
This case occurs often enough (around 45% of conversion specs executed
in our regression tests are just "%s") that it's worth an extra test
per conversion spec to allow skipping all the logic associated with
field widths and padding when it happens.
Discussion: https://postgr.es/m/26193.1538582367@sss.pgh.pa.us
-rw-r--r-- | src/port/snprintf.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/port/snprintf.c b/src/port/snprintf.c index cad7345357d..b9b6add1fa6 100644 --- a/src/port/snprintf.c +++ b/src/port/snprintf.c @@ -431,6 +431,19 @@ dopr(PrintfTarget *target, const char *format, va_list args) /* Process conversion spec starting at *format */ format++; + + /* Fast path for conversion spec that is exactly %s */ + if (*format == 's') + { + format++; + strvalue = va_arg(args, char *); + Assert(strvalue != NULL); + dostr(strvalue, strlen(strvalue), target); + if (target->failed) + break; + continue; + } + fieldwidth = precision = zpad = leftjust = forcesign = 0; longflag = longlongflag = pointflag = 0; fmtpos = accum = 0; |