aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2018-10-03 13:05:01 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2018-10-03 13:05:01 -0400
commit6d842be6c11887930a0f4128fd6aa4de427cfd2a (patch)
tree81846676d12c8eef74ce60e25197ccac756a9b7f
parentabd9ca377d669a6e0560e854d7e987438d0e612e (diff)
downloadpostgresql-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.c13
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;