Hi, On 2018-09-24 13:18:47 -0400, Tom Lane wrote: > 0002 changes things so that we always use our snprintf, removing all the > configure logic associated with that.
In the commit message you wrote: > Preliminary performance testing suggests that as it stands, snprintf.c is > faster than the native printf functions for some tasks on some platforms, > and slower for other cases. A pending patch will improve that, though > cases with floating-point conversions will doubtless remain slower unless > we want to put a *lot* of effort into that. Still, we've not observed > that *printf is really a performance bottleneck for most workloads, so > I doubt this matters much. I severely doubt the last sentence. I've *many* times seen *printf be a significant bottleneck. In particular just about any pg_dump of a database that has large tables with even just a single float column is commonly bottlenecked on float -> string conversion. A trivial bad benchmark: CREATE TABLE somefloats(id serial, data1 float8, data2 float8, data3 float8); INSERT INTO somefloats(data1, data2, data3) SELECT random(), random(), random() FROM generate_series(1, 10000000); VACUUM FREEZE somefloats; postgres[12850][1]=# \dt+ somefloats List of relations ┌────────┬────────────┬───────┬────────┬────────┬─────────────┐ │ Schema │ Name │ Type │ Owner │ Size │ Description │ ├────────┼────────────┼───────┼────────┼────────┼─────────────┤ │ public │ somefloats │ table │ andres │ 575 MB │ │ └────────┴────────────┴───────┴────────┴────────┴─────────────┘ 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) IOW, we regress copy performance by about 2x. And one int and three floats isn't a particularly insane table layout. I'm not saying we shouldn't default to our printf - in fact I think we probably past due to use a faster float->string conversion than we portably get from the OS - but I don't think we can default to our sprintf without doing something about the float conversion performance. Greetings, Andres Freund