Re: Allowing printf("%m") only where it actually works
Andres Freund <andres@anarazel.de>
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
Commits
-
In pg_log_generic(), be more paranoid about preserving errno.
- cf665ad4c89e 12.0 landed
- fb30c9c1c5c3 13.0 landed
-
Make src/common/exec.c's error logging less ugly.
- b6b297d20df9 12.0 landed
-
Select appropriate PG_PRINTF_ATTRIBUTE for recent NetBSD.
- aed9fa0bd897 12.0 landed
-
Fix detection of the result type of strerror_r().
- e5baf8c27e6c 9.4.20 landed
- 8b36dc588d10 9.5.15 landed
- 7871a36255e2 11.0 landed
- 2855421ec728 9.6.11 landed
- 0aa1e0ef167d 10.6 landed
- 08aad3c81eff 9.3.25 landed
-
Try another way to detect the result type of strerror_r().
- 751f532b9766 12.0 landed
-
Clean up *printf macros to avoid conflict with format archetypes.
- 8b91d258844a 12.0 landed
-
Fix link failures due to snprintf/strerror changes.
- a6b88d682cbe 12.0 landed
-
Implement %m in src/port/snprintf.c, and teach elog.c to rely on that.
- d6c55de1f99a 12.0 landed
-
Always use our own versions of *printf().
- 96bf88d52711 12.0 landed
-
Incorporate strerror_r() into src/port/snprintf.c, too.
- 758ce9b77948 12.0 landed
-
Convert elog.c's useful_strerror() into a globally-used strerror wrapper.
- 26e9d4d4ef16 12.0 landed
-
Revert "Distinguish printf-like functions that support %m from those that don't."
- 46b5e7c4b5be 12.0 landed
-
Produce compiler errors if errno is referenced inside elog/ereport calls.
- a2a8acd15217 12.0 landed
-
Distinguish printf-like functions that support %m from those that don't.
- 3a60c8ff892a 12.0 landed
-
Fix unportable usage of printf("%m").
- a13b47a59ffc 11.0 cited
-
Be more robust when strerror() doesn't give a useful result.
- 8e68816cc256 9.4.0 cited