[erlang-questions] Please suggest why these repeated timings increase
Isaac Gouy
igouy2@REDACTED
Sun Aug 28 00:50:09 CEST 2011
I found my mistake ;-)
I'd put this in to debug, and then removed the handler
MainPid ! {details,[Id,Previous,self(),Next]}
so messages were just accumulating...
----- Forwarded Message -----
> From: Isaac Gouy <igouy2@REDACTED>
> To: "erlang-questions@REDACTED" <erlang-questions@REDACTED>
> Cc:
> Sent: Saturday, August 27, 2011 11:17 AM
> Subject: Please suggest why these repeated timings increase
>
> Here's a tiny (somewhat silly) program - a circle of processes, removed one
> at a time until there's only one left.
>
> I expect there's a simple explanation - I expect I've done something
> basic wrong - but repeatedly creating and reducing such a circle of processes
> seems to slowdown, and I'd like to understand why.
>
> There doesn't seem to be any accumulation of zombie processes, so I'm a
> little puzzled what else might be going on.
>
>
>
> $ /usr/local/src/otp_src_R14B02/bin/erlc josephus.erl
>
> $ /usr/local/src/otp_src_R14B02/bin/erl -noshell -run josephus main
>
> 943157
> 2219531
> 3490628
> 4814178
> 6334408
> 7419798
> 8615281
> 9778484
> 11364821
> 12440720
>
>
> -module(josephus).
> -export([main/0,soldier/3,timedloop/1]).
>
> soldier( PreviousPid, NextPid, Id ) ->
> receive
> {MainPid,countoff,Kth,K} ->
> countoff(PreviousPid,NextPid,Id,MainPid,Kth,K);
>
> {set_previous,Pid} ->
> soldier(Pid,NextPid,Id);
>
> {set_next,Pid} ->
> soldier(PreviousPid,Pid,Id)
> end.
>
>
> countoff( Previous, Next, Id, MainPid, Kth, K ) when Kth == K ->
> MainPid ! {details,[Id,Previous,self(),Next]},
> if
> Previous == self() ->
> MainPid ! {countoff_ack,Id};
>
> true ->
> Previous ! {set_next,Next},
> Next ! {set_previous,Previous},
> Next ! {MainPid,countoff,Kth,1}
> end;
>
> countoff( Previous, Next, Id, MainPid, Kth, K ) ->
> Next ! {MainPid,countoff,Kth,K+1},
> soldier(Previous,Next,Id).
>
>
> ring(N) ->
> ring(N,1,nil,[]).
>
> ring(N,I,P,L) when I =< N ->
> Pid = spawn(josephus,soldier,[P,nil,I]),
> ring(N,I+1,Pid,[Pid|L]);
>
> ring(_,_,Last,L) ->
> First = ring_set_next(nil,L),
> Last ! {set_next,First},
> First ! {set_previous,Last},
> First.
>
> ring_set_next(Last,[]) -> Last;
> ring_set_next(P,[Pid|T]) ->
> Pid ! {set_next,P},
> ring_set_next(Pid,T).
>
>
> countoffSoldiers(N,Kth) ->
> Soldier = ring(N),
> %Soldier ! {self(),countoff,Kth,1}, % standard Josephus problem
> Soldier ! {self(),countoff,Kth,Kth},
> receive {countoff_ack,I} -> I end.
>
>
> %-----------------------------------------------------------------------------
>
> timedloop(0) -> ok;
> timedloop(N) ->
> countoffSoldiers(40,3),
> timedloop(N-1).
>
> repeat(_,0) -> ok;
> repeat(N, Repeat) ->
> {MicroSecs,I} = timer:tc(josephus,timedloop,[N]),
> io:format("~w~n",[MicroSecs]),
> repeat(N,Repeat-1).
>
> main() ->
> repeat(1000,10),
> halt(0).
>
More information about the erlang-questions
mailing list