diff options
| author | Robert Haas | 2011-08-03 20:26:40 +0000 |
|---|---|---|
| committer | Robert Haas | 2011-08-03 20:26:40 +0000 |
| commit | 4af43ee3f165c8e4b332a7e680a44f4b7ba2d3c1 (patch) | |
| tree | c75980425aaaae3144a458871139cdec9f5537ab /src/include/optimizer | |
| parent | ac36e6f71f197540b8ee83c97f338ae5e5163f30 (diff) | |
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.
Diffstat (limited to 'src/include/optimizer')
| -rw-r--r-- | src/include/optimizer/geqo.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/include/optimizer/geqo.h b/src/include/optimizer/geqo.h index 62f1fd9418..2dd28253e1 100644 --- a/src/include/optimizer/geqo.h +++ b/src/include/optimizer/geqo.h @@ -73,7 +73,7 @@ extern double Geqo_seed; /* 0 .. 1 */ typedef struct { List *initial_rels; /* the base relations we are joining */ - unsigned short random_state[3]; /* state for erand48() */ + unsigned short random_state[3]; /* state for pg_erand48() */ } GeqoPrivateData; |
