On 2018-08-17 14:32:59 -0400, Tom Lane wrote: > I've been looking into the possible performance consequences of that, > in particular comparing snprintf.c to the library versions on macOS, > FreeBSD, OpenBSD, and NetBSD. While it held up well in simpler cases, > I noted that it was significantly slower on long format strings, which > I traced to two separate problems:
> Perhaps there's a way to improve that > without writing our own floating-point conversion code, but I'm not > seeing an easy way offhand. I don't think that's a showstopper though. > This code is now faster than the native code for very many other cases, > so on average it should cause no real performance problem. I kinda wonder if we shouldn't replace the non pg_* functions in snprintf.c with a more modern copy of a compatibly licensed libc. Looks to me like our implementation has forked off some BSD a fair while ago. There seems to be a few choices. Among others: - freebsd libc: https://github.com/freebsd/freebsd/blob/master/lib/libc/stdio/vfprintf.c (floating point stuff is elsewhere) - musl libc: https://git.musl-libc.org/cgit/musl/tree/src/stdio/vfprintf.c - stb (as Alexander referenced earlier) https://github.com/nothings/stb/blob/master/stb_sprintf.h I've not benchmarked any of these. Just by looking at the code, the musl one looks by far the most compact - looks like all the relevant code is in the one file referenced. Greetings, Andres Freund