Fastest pseudo-random number-generator: erlang:statistics(io) ?

Thijs <>
Tue Nov 24 16:00:09 CET 2009


Today I needed a faster alternative for erlang:now(). It turns out
that using erlang:now() is quite slow: it requires a system call. I
decided to test some alternatives. My requirements are: speed, speed,
speed :) I will use it in a server that is quite busy, so I figured I
could use various system metrics to generate random numbers. I use
these pseudo-random numbers to do load-balancing, log requests at
random etc.

benchmark results :

erlang:now()  	288.090
erlang:statistics(io) 	2.730.853
erlang:statistics(wall_clock) 	280.396
erlang:statistics(runtime) 	510.765
erlang:statistics(reductions) 	471.688
erlang:statistics(context_switches) 	493.851
random:uniform()   	870.261

This test is spawning 100 concurrent processes, each executing 10000
calls to each function. Two notes:
1. Note that you can only use this function if your server is actually
performing (lots) of IO
2. random:uniform() needs to be seeded for real use (each process
starts the same), I didn't do that.

Based on these tests, erlang:statistics(io) is the clear winner. I
will use it now for picking random elements from lists and replacing
pg2:get_closest_pid(Name).


Does anyone have any faster suggestions than erlang:statistics(io) ?


More information about the erlang-questions mailing list