Re: Performance improvements for src/port/snprintf.c - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Performance improvements for src/port/snprintf.c
Date
Msg-id 3316.1538589695@sss.pgh.pa.us
Whole thread Raw
In response to Re: Performance improvements for src/port/snprintf.c  (Andres Freund <andres@anarazel.de>)
Responses Re: Performance improvements for src/port/snprintf.c  (Alvaro Herrera <alvherre@2ndquadrant.com>)
Re: Performance improvements for src/port/snprintf.c  (Andres Freund <andres@anarazel.de>)
List pgsql-hackers
Andres Freund <andres@anarazel.de> writes:
> So when using pg's snprintf() to print a single floating point number
> with precision, we get nearly a 10% boost.

I just tested that using my little standalone testbed, and I failed
to replicate the result.  I do see that strfromd is slightly faster,
but it's just a few percent measuring snprintf.c in isolation --- in
the overall context of COPY, I don't see how you get to 10% net savings.

So I continue to think there's something fishy about your test case.

BTW, so far as I can tell on F28, strfromd isn't exposed without
"-D__STDC_WANT_IEC_60559_BFP_EXT__", which seems fairly scary;
what else does that affect?

            regards, tom lane

diff --git a/src/port/snprintf.c b/src/port/snprintf.c
index b9b6add..f75369c 100644
--- a/src/port/snprintf.c
+++ b/src/port/snprintf.c
@@ -1137,17 +1137,19 @@ fmtfloat(double value, char type, int forcesign, int leftjust,
         zeropadlen = precision - prec;
         fmt[0] = '%';
         fmt[1] = '.';
-        fmt[2] = '*';
-        fmt[3] = type;
-        fmt[4] = '\0';
-        vallen = sprintf(convert, fmt, prec, value);
+        fmt[2] = (prec / 100) + '0';
+        fmt[3] = ((prec % 100) / 10) + '0';
+        fmt[4] = (prec % 10) + '0';
+        fmt[5] = type;
+        fmt[6] = '\0';
+        vallen = strfromd(convert, sizeof(convert), fmt, value);
     }
     else
     {
         fmt[0] = '%';
         fmt[1] = type;
         fmt[2] = '\0';
-        vallen = sprintf(convert, fmt, value);
+        vallen = strfromd(convert, sizeof(convert), fmt, value);
     }
     if (vallen < 0)
         goto fail;

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Performance improvements for src/port/snprintf.c
Next
From: Alvaro Herrera
Date:
Subject: Re: Performance improvements for src/port/snprintf.c