Make pgbench use erand48() rather than random().
Robert Haas <rhaas@postgresql.org>
Make pgbench use erand48() rather than random(). glibc renders random() thread-safe by wrapping a futex lock around it; testing reveals that this limits the performance of pgbench on machines with many CPU cores. Rather than switching to random_r(), which is only available on GNU systems and crashes unless you use undocumented alchemy to initialize the random state properly, switch to our built-in implementation of erand48(), which is both thread-safe and concurrent. Since the list of reasons not to use the operating system's erand48() is getting rather long, rename ours to pg_erand48() (and similarly for our implementations of lrand48() and srand48()) and just always use those. We were already doing this on Cygwin anyway, and the glibc implementation is not quite thread-safe, so pgbench wouldn't be able to use that either. Per discussion with Tom Lane.
Files
| Path | Change | +/− |
|---|---|---|
| configure | modified | +1 −13 |
| configure.in | modified | +1 −7 |
| contrib/pgbench/pgbench.c | modified | +15 −17 |
| src/backend/optimizer/geqo/geqo_random.c | modified | +1 −1 |
| src/backend/optimizer/geqo/geqo_selection.c | modified | +3 −3 |
| src/include/optimizer/geqo.h | modified | +1 −1 |
| src/include/pg_config.h.in | modified | +0 −3 |
| src/include/port.h | modified | +3 −6 |
| src/port/erand48.c | modified | +11 −7 |
| src/port/Makefile | modified | +2 −2 |
| src/port/random.c | modified | +1 −1 |
| src/port/srandom.c | modified | +1 −1 |