Egloos | Log-in


Ring Benchmark

Programming Erlang의 6장 문제에 나오는 Ring Benchmark이다. N개의 프로세스를 링 형태로 연결 해놓고 M개의 메시지를 보내서 링을 한바퀴 돌리는 문제다. 즉 N * M 번의 메시지 전달이 일어나는데 그 시간이 얼마나 걸리는지 측정한다.

짜기는 했는데 별로 자신은 없다. 코드에확인용 io:format이 군데 군데 들어가 있는 것이 그 증거. 같은 코드를 적어도 3번은 짜봐야 볼만한 코드가 나올 것 같다.

소스

-module(ring).
-compile(export_all).

start(N) ->
start(N, undefined, []).

start(0, Next, Spawned) ->
Next ! {route, Next},
Spawned;
start(N, Next, Spawned) ->
Pid = spawn(fun() -> loop(Next) end),
start(N - 1, Pid, [Pid|Spawned]).

loop(Next) ->
receive
{route, Head} when Next =:= undefined ->
%io:format("~w: Link to ~w~n", [self(), Head]),
loop(Head);
{route, Head} ->
%io:format("~w: Link to ~w~n", [self(), Next]),
Next ! {route, Head},
loop(Next);
{stop} ->
true;
{From, {in, Id}} ->
%io:format("~w: Pass ~w to ~w~n", [self(), Id, Next]),
Next ! {pass, Id, self(), From},
loop(Next);
{pass, Id, Destination, Origin} when Destination =:= self() ->
%io:format("~w: Eat ~w~n", [self(), Id]),
Origin ! {out, Id},
loop(Next);
{pass, Id, Destination, Origin} ->
%io:format("~w: Pass ~w to ~w~n", [self(), Id, Next]),
Next ! {pass, Id, Destination, Origin},
loop(Next)
end.

send(Pid, Ids) ->
lists:map(fun(Id) -> Pid ! {self(), {in, Id}} end, Ids).

wait([]) ->
true;
wait([Id|T]) ->
receive
{out, Id} ->
wait(T)
end.

stop(Pids) ->
lists:map(fun(Pid) -> Pid ! {stop} end, Pids).

stopwatch_start() ->
statistics(runtime),
statistics(wall_clock).

stopwatch_stop() ->
{_, Runtime} = statistics(runtime),
{_, WallClock} = statistics(wall_clock),
{Runtime, WallClock}.

bench(N, M) ->
io:format("Start~n"),
Pids = start(N),
Ids = lists:seq(1, M),
stopwatch_start(),
send(hd(Pids), Ids),
wait(Ids),
{Runtime, WallClock} = stopwatch_stop(),
stop(Pids),
io:format("Runtime: ~wms, Wall clock: ~wms~n", [Runtime, WallClock]).


결과

15> ring:bench(10000, 1000).
Start
Stop 3250, 4300
ok


프로세스 만 개 만들어서 메시지 천 개 한 바퀴 돌리는데 4.3초 걸린다. 빠른지는 모르겠다. 비교를 할 수 없으니. OS 쓰레드는 만 개 만들 수도 없다.

by 만성피로 | 2007/04/12 23:59 | Erlang | 트랙백(1) | 덧글(0)

트랙백 주소 : http://colus.egloos.com/tb/3301140
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from D o u b l e K at 2008/07/08 03:22

제목 : Programming Erlang - Ring Test
책 "Programming Erlang" 에서 8.11에 나오는 과제 2번 링 벤치마크(Ring Tester). 오랫만에 즐겁게 머리써봤다. 다른사람이 만든건 어떨지 궁금하다. === 역시 내가 만든건 여러모로 부족했다. OTL 만성피로님의 Ring Benchmark 프로세스들의 고리를 만드는 방법이 감탄을 자아낸다. 개념 보기 -module (ring_test). -compile(export_all). % 기본 프로세스 10개 start() ......more

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶