[erlang-questions] OTP process startup vs spawn overhead
Thu Jul 28 13:04:42 CEST 2011
Fun = fun() -> [ Pid ! ok || _ <- lists:seq(1,10000), Pid <-
spawn_link(?MODULE, recv, ) ] end.
This wont work, because spawn_link does not generate a list :)
> Are you running that expression from the shell?
I was executing the tests from the shell yes, but if I do the
following with a compiled function
[ timer:tc(fun() -> [ Pid ! ok || Pid <- [spawn(fun() ->
test_gen:loop() end) || _ <- lists:seq(1,10000)] ] end) || _ <-
I still get the same slow performance. It must be related to creation
of the fun then.
This gets better results
[ timer:tc(fun() -> [ Pid ! ok || Pid <- [spawn(test_gen, loop, ) ||
_ <- lists:seq(1,10000)] ] end) || _ <- lists:seq(1,10)].
It also shows a bout 45% performance penalty for spawning OTP
processes like mad instead of using spawn(Module, Function, Args).
On the other hand using spawn(Fun) seems to be 4 times slower. This
is more or less in line with what the efficiency guide says.
It pays to measure :)
Moral of the story: Spawn your workers with spawn(M,F,A) or use OTP
processes if you can afford the slight performance hit and gain a lot
More information about the erlang-questions