Re: Performance improvements for src/port/snprintf.c

From: Andres Freund <andres(at)anarazel(dot)de>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: Alexander Kuzmenkov <a(dot)kuzmenkov(at)postgrespro(dot)ru>, pgsql-hackers(at)lists(dot)postgresql(dot)org
Subject: Re: Performance improvements for src/port/snprintf.c
Date: 2018-09-26 22:18:14
Message-ID: 20180926221814.el5nwmkez6zfmzbz@alap3.anarazel.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 2018-09-26 15:04:20 -0700, Andres Freund wrote:
> On 2018-09-12 14:14:15 -0400, Tom Lane wrote:
> > Alexander Kuzmenkov <a(dot)kuzmenkov(at)postgrespro(dot)ru> writes:
> > > I benchmarked this, using your testbed and comparing to libc sprintf
> > > (Ubuntu GLIBC 2.27-0ubuntu3) and another implementation I know [1], all
> > > compiled with gcc 5.
> >
> > Thanks for reviewing!
> >
> > The cfbot noticed that the recent dlopen patch conflicted with this in
> > configure.in, so here's a rebased version. The code itself didn't change.
>
> Conflicts again, but not too hard to resolve.
>
> The mini benchmark from http://archives.postgresql.org/message-id/20180926174645.nsyj77lx2mvtz4kx%40alap3.anarazel.de
> is significantly improved by this patch.
>
> > 96bf88d52711ad3a0a4cc2d1d9cb0e2acab85e63:
> >
> > COPY somefloats TO '/dev/null';
> > COPY 10000000
> > Time: 24575.770 ms (00:24.576)
> >
> > 96bf88d52711ad3a0a4cc2d1d9cb0e2acab85e63^:
> >
> > COPY somefloats TO '/dev/null';
> > COPY 10000000
> > Time: 12877.037 ms (00:12.877)
>
> This patch:
>
> postgres[32704][1]=# ;SELECT pg_prewarm('somefloats');COPY somefloats TO '/dev/null';
> Time: 0.269 ms
> ┌────────────┐
> │ pg_prewarm │
> ├────────────┤
> │ 73530 │
> └────────────┘
> (1 row)
>
> Time: 34.983 ms
> COPY 10000000
> Time: 15511.478 ms (00:15.511)
>
>
> The profile from 96bf88d52711ad3a0a4cc2d1d9cb0e2acab85e63^ is:
> + 38.15% postgres libc-2.27.so [.] __GI___printf_fp_l
> + 13.98% postgres libc-2.27.so [.] hack_digit
> + 7.54% postgres libc-2.27.so [.] __mpn_mul_1
> + 7.32% postgres postgres [.] CopyOneRowTo
> + 6.12% postgres libc-2.27.so [.] vfprintf
> + 3.14% postgres libc-2.27.so [.] __strlen_avx2
> + 1.97% postgres postgres [.] heap_deform_tuple
> + 1.77% postgres postgres [.] AllocSetAlloc
> + 1.43% postgres postgres [.] psprintf
> + 1.25% postgres libc-2.27.so [.] _IO_str_init_static_internal
> + 1.09% postgres libc-2.27.so [.] _IO_vsnprintf
> + 1.09% postgres postgres [.] appendBinaryStringInfo
>
> The profile of master with this patch is:
>
> + 32.38% postgres libc-2.27.so [.] __GI___printf_fp_l
> + 11.08% postgres libc-2.27.so [.] hack_digit
> + 9.55% postgres postgres [.] CopyOneRowTo
> + 6.24% postgres libc-2.27.so [.] __mpn_mul_1
> + 5.01% postgres libc-2.27.so [.] vfprintf
> + 4.91% postgres postgres [.] dopr.constprop.4
> + 3.53% postgres libc-2.27.so [.] __strlen_avx2
> + 1.55% postgres libc-2.27.so [.] __strchrnul_avx2
> + 1.49% postgres libc-2.27.so [.] __memmove_avx_unaligned_erms
> + 1.35% postgres postgres [.] AllocSetAlloc
> + 1.32% postgres libc-2.27.so [.] _IO_str_init_static_internal
> + 1.30% postgres postgres [.] FunctionCall1Coll
> + 1.27% postgres postgres [.] psprintf
> + 1.16% postgres postgres [.] appendBinaryStringInfo
> + 1.16% postgres libc-2.27.so [.] _IO_old_init
> + 1.06% postgres postgres [.] heap_deform_tuple
> + 1.02% postgres libc-2.27.so [.] sprintf
> + 1.02% postgres libc-2.27.so [.] _IO_vsprintf
>
> (all functions above 1%)
>
>
> I assume this partially is just the additional layers of function calls
> (psprintf, pvsnprintf, pg_vsnprintf, dopr) that are now done, in
> addition to pretty much the same work as before (i.e. sprintf("%.*f")).

I'm *NOT* proposing that as the actual solution, but as a datapoint, it
might be interesting that hardcoding the precision and thus allowing use
ofusing strfromd() instead of sprintf yields a *better* runtime than
master.

Time: 10255.134 ms (00:10.255)

Greetings,

Andres Freund

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2018-09-26 22:31:07 Re: Allowing printf("%m") only where it actually works
Previous Message Andres Freund 2018-09-26 22:04:20 Re: Performance improvements for src/port/snprintf.c