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;