# [erlang-questions] Ring Benchmark Problem

Harit Himanshu harit.subscriptions@REDACTED
Mon Jan 12 19:25:34 CET 2015

```That sounds like a good idea Robert, could you please guide me how to
achieve this?

Thanks

On Mon, Jan 12, 2015 at 10:00 AM, Robert Virding <rvirding@REDACTED> wrote:

> A much better way than sending the path around is for every process to
> keep track for itself the next process in the ring so you just need to send
> the message between the processes. At least if you are after speed. If you
> do do need to be able to dynamically restructure the ring it would be easy
> to add an extra message where you tell a process its new next process.
>
> Robert
>
>
> On 11 January 2015 at 20:48, Harit Himanshu <harit.subscriptions@REDACTED
> > wrote:
>
>> Hello there,
>>
>> I need help with code review on my attempt to following problem
>>
>>  Write a ring benchmark. Create N processes in a ring. Send a message
>> round the ring M times so that a total of N * M messages get sent. Time
>> how long this takes for different values of N and M.
>>
>> I have not timed this yet, and guidance on recommended ways to time is
>> very much appreciated.
>>
>> For now, following is the code for ring that I wrote. Please let me know
>> if there are any shortcomings or code could be written in an much idiomatic
>> way.
>>
>> Thanks a lot
>> + Harit
>>
>> *Code*
>>
>> -module(ring).
>> -author("harith").
>>
>> %% API
>> -export([message/2]).
>>
>> % create ring of N processes and
>> % send M messages between them
>> message(N, M) when is_integer(N), is_integer(M), N > 0, M > 0 ->
>>   Ring = create_ring(N),
>>   [Start | T] = Ring,
>>   Start ! {T, Ring, 1, M}.
>>
>> create_ring(N) ->
>>   Processes = [spawn(fun() -> loop() end) || _ <- lists:seq(1, N)],
>>   [H | _] = Processes,
>>   lists:append(Processes, [H]).
>>
>> loop() ->
>>   receive
>>     {[H | T], _L, CurrentMessage, M} ->
>>       io:format("~p received ~p~n", [self(), CurrentMessage]),
>>       H ! {T, _L, CurrentMessage, M},
>>       loop();
>>     {[], Ring, CurrentMessage, M} ->
>>       io:format("~p received ~p with empty list~n", [self(),
>> CurrentMessage]),
>>       case CurrentMessage < M of
>>         true ->
>>           [_ | [Next | T]] = Ring,
>>           NewMessage = CurrentMessage + 1,
>>           io:format("sending message ~p to ~p~n", [NewMessage, Next]),
>>           Next ! {T, Ring, NewMessage, M};
>>         false -> io:format("done sending ~p messages in ~p ring, taking
>> rest now.~n",[M, Ring])
>>       end,
>>       loop()
>>   end.
>>
>> *Output*
>> 1> ring:message(4, 3).
>> <0.33.0> received 1
>> {[<0.34.0>,<0.35.0>,<0.36.0>,<0.33.0>],
>>  [<0.33.0>,<0.34.0>,<0.35.0>,<0.36.0>,<0.33.0>],
>>  1,3}
>> <0.34.0> received 1
>> <0.35.0> received 1
>> 2> <0.36.0> received 1
>> 2> <0.33.0> received 1 with empty list
>> 2> sending message 2 to <0.34.0>
>> 2> <0.34.0> received 2
>> 2> <0.35.0> received 2
>> 2> <0.36.0> received 2
>> 2> <0.33.0> received 2 with empty list
>> 2> sending message 3 to <0.34.0>
>> 2> <0.34.0> received 3
>> 2> <0.35.0> received 3
>> 2> <0.36.0> received 3
>> 2> <0.33.0> received 3 with empty list
>> 2> done sending 3 messages in
>> [<0.33.0>,<0.34.0>,<0.35.0>,<0.36.0>,<0.33.0>] ring, taking rest now.
>> 2>
>>
>> _______________________________________________
>> erlang-questions mailing list
>> erlang-questions@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-questions
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20150112/f7e44670/attachment.htm>
```

More information about the erlang-questions mailing list