Я получил два кода, которые создают кольцо узлов (ведомых в коде), одним из которых является мастер (который отправляет сообщение, а затем его сообщение доставляется через кольцо узлов, пока он не получит его снова). Мастер посылает М сообщение, а в кольце N узлов.
ringA создает кольцо таким образом, что каждый узел создает свой следующий узел (каждый процесс создает свой следующий процесс)
ringB создает кольцо таким образом, что мастер создает все другие узлы (ведомые), а затем начинает отправку сообщений M.
Теоретически я думал, что ringB будет работать быстрее, потому что он на самом деле ждет, пока процесс построит, а затем создаст следующий узел, а ringB создаст все узлы одновременно, поэтому он должен работать немного быстрее.
На практике, я получаю кольцо B быстрее последовательно, почему это так?
ringA (N, M) ->
spawn(fun ()-> master(N-1, M) end),
io:format("").
master(N, M) ->
SelfPid=self(),
T1=erlang:timestamp(),
if N>0 ->
P=spawn(fun ()-> slave(N-1, SelfPid) end);
true ->
P=self()
end,
receive
finishedCreatingAllnodes->
masterRec (M, P, T1)
end.
masterRec (M, P, T1) ->
if M>0 ->
P ! message,
receive
message ->
masterRec (M-1, P, T1)
end;
true ->
P ! shutdown,
T2=erlang:timestamp(),
io:format("runtime=~p microseconds~n",
[timer:now_diff(T2,T1)])
end.
slave(N, MasterPid) ->
if N>0 ->
P=spawn(fun () -> slave(N-1, MasterPid) end);
true ->
MasterPid ! finishedCreatingAllnodes,
P=MasterPid
end,
slaveRec (P).
slaveRec (P) ->
receive
message ->
P ! message,
slaveRec (P);
shutdown ->
P ! shutdown
end.
ringB (N, M) ->
_Master= spawn(fun () -> masterB(N-1, M) end),
io:format("").
masterB(N, M) ->
T1=erlang:timestamp(),
NextNode= createSlaveRing(N, self()),
masterRec (M, NextNode, T1).
createSlaveRing(1, NextNode) ->
spawn (fun() -> slaveRec(NextNode) end);
createSlaveRing(N, NextNode) ->
P=spawn (fun() -> slaveRec(NextNode) end),
createSlaveRing(N-1, P).