та же функция, два кода - какой код будет работать быстрее? запутанным - PullRequest
0 голосов
/ 25 мая 2019

Я получил два кода, которые создают кольцо узлов (ведомых в коде), одним из которых является мастер (который отправляет сообщение, а затем его сообщение доставляется через кольцо узлов, пока он не получит его снова). Мастер посылает М сообщение, а в кольце 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).
...