Improved printing; Erlang rough equivalent

This commit is contained in:
Tony Garnock-Jones 2020-12-09 19:47:33 +01:00
parent f61126c5f2
commit 26e29ac1ce
2 changed files with 60 additions and 3 deletions

View File

@ -45,12 +45,13 @@ public class Main implements IForwarder {
public void handleMessage(int hopCount) {
this._remainingToReceive--;
if (this._remainingToReceive == 0) {
long delta = System.currentTimeMillis() - this._startTime;
double delta = (System.currentTimeMillis() - this._startTime) / 1000.0;
long nMessages = _nActors * _nRounds;
double hz = nMessages / (delta / 1000.0);
double hz = nMessages / delta;
Actor.current().stop();
Actor.log().info(String.format("Stop after %d messages; %.1f Hz",
Actor.log().info(String.format("Stop after %d messages; %.1f seconds, %.1f Hz",
nMessages,
delta,
hz));
}
}

View File

@ -0,0 +1,56 @@
-module(ring).
%% erlc ring.erl; erl +P 10000000 -eval 'io:format("~p~n", [ring:start(1000000, 1000)]), init:stop()'
-export([start/2]).
start(NActors, NRounds) ->
io:format("Starting threads...~n"),
First = spawn1(NRounds),
Peers = [Last | _] = spawnN(NActors - 1, [First], NRounds),
First ! {peer, Last},
io:format("Starting measurement (~p processes)...~n", [length(Peers)]),
{Microseconds, ok} =
timer:tc(fun () ->
[P ! {hop, 0} || P <- Peers],
wait_for_all(NActors)
end),
Seconds = Microseconds / 1000000.0,
{ok, {{seconds, Seconds}, {hz, NActors * NRounds / Seconds}}}.
wait_for_all(0) ->
ok;
wait_for_all(Remaining) ->
receive
one_actor_done ->
wait_for_all(Remaining - 1)
end.
spawn1(NRounds) ->
Main = self(),
spawn(fun () -> forwarder_main(Main, NRounds) end).
spawnN(0, Peers, _NRounds) ->
Peers;
spawnN(Remaining, Peers = [Peer | _], NRounds) ->
A = spawn1(NRounds),
A ! {peer, Peer},
spawnN(Remaining - 1, [A | Peers], NRounds).
forwarder_main(MainActor, NRounds) ->
receive
{peer, Peer} ->
forwarder_main_loop(MainActor, Peer, NRounds)
end.
forwarder_main_loop(MainActor, Peer, NRounds) ->
receive
{hop, HopCount} ->
if
HopCount < NRounds - 1 ->
Peer ! {hop, HopCount + 1};
true ->
MainActor ! one_actor_done
end,
forwarder_main_loop(MainActor, Peer, NRounds)
end.