mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
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.
This commit is contained in:
@ -36,5 +36,5 @@ geqo_rand(PlannerInfo *root)
|
||||
{
|
||||
GeqoPrivateData *private = (GeqoPrivateData *) root->join_search_private;
|
||||
|
||||
return erand48(private->random_state);
|
||||
return pg_erand48(private->random_state);
|
||||
}
|
||||
|
@ -64,9 +64,9 @@ geqo_selection(PlannerInfo *root, Chromosome *momma, Chromosome *daddy,
|
||||
* Ensure we have selected different genes, except if pool size is only
|
||||
* one, when we can't.
|
||||
*
|
||||
* This code has been observed to hang up in an infinite loop when the
|
||||
* platform's implementation of erand48() is broken. We consider that a
|
||||
* feature: it lets you know you'd better fix the random-number generator.
|
||||
* This code was observed to hang up in an infinite loop when the
|
||||
* platform's implementation of erand48() was broken. We now always
|
||||
* use our own version.
|
||||
*/
|
||||
if (pool->size > 1)
|
||||
{
|
||||
|
Reference in New Issue
Block a user