]> granicus.if.org Git - postgresql/commitdiff
Provide fast path in snprintf.c for conversion specs that are just "%s".
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 3 Oct 2018 17:05:01 +0000 (13:05 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 3 Oct 2018 17:05:01 +0000 (13:05 -0400)
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

src/port/snprintf.c

index cad7345357d1ccfa1f9edb23b362ea188a31e1b5..b9b6add1fa6ae77f16bbc28723d80c412241e7cb 100644 (file)
@@ -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;