Erlang编写一个环形基准测试。在一个环中创建N个进程。然后沿着环发送一条消息M次,最后总共发送N*M条消息,在N和M的不同取值下测试整个过程会消耗多长时间。
Erlang程序设计中文版的8.11习题
-module(hoop).
%% ====================================================================
%% API functions
%% ====================================================================
-export([start/3,send1/3,run/2,loop/1]).
%% ====================================================================
%% Internal functions
%% ====================================================================
%%开始,注册N个进程,start(开始进程数值,进程数,发送请求数)
start(N,N,M)->
case N>=1 of
true->
register(list_to_atom("qqqq"++integer_to_list(1)),spawn(fun()->loop(1) end)),
io:format("startstartstartstartstart~p~n",[list_to_atom("qqqq"++integer_to_list(1))]);
_->false
end;
%%开始,注册N个进程
start(T,N,M)->
case N>=1 of
true->
register(list_to_atom("qqqq"++integer_to_list(N+1-T)),spawn(fun()->loop(N+1-T) end)),
%%io:format("startstartstartstartstart~p~n",[list_to_atom("qqqq"++integer_to_list(N+1-T))]),
start(T+1,N,M);
_->false
end.
%%开始向第首进程发送stop消息
send1(M,M,N)->
%%io:format(" send send111111~p~n",[{N,stop}]),
list_to_atom("qqqq"++integer_to_list(N)) ! {N,stop};
%%开始向第首进程发送request消息M-T次
send1(T,M,N) when T<M ->
%%io:format(" send send2222222 ~p~n",[{N,request}]),
list_to_atom("qqqq"++integer_to_list(N)) ! {N,request},
send1(T+1,M,N).
%%进程定义,进程n只接受给n的信息 N>1 判断是不是最后一个进程
loop(N)->
receive
{N,stop} ->
case N>1 of
true->
%%io:format(".......stop~p~n....",[list_to_atom("qqqq"++integer_to_list(N-1))]),
list_to_atom("qqqq"++integer_to_list(N-1))! {N-1,stop},void;
_ ->io:format("game over ")
end;
{N,request} ->
case N>1 of
true->
%%io:format(".......request..~p~n....",[list_to_atom("qqqq"++integer_to_list(N-1))]),
list_to_atom("qqqq"++integer_to_list(N-1))! {N-1,request},
loop(N);
_ ->loop(N)
end
end.
run(N,M)->
statistics(wall_clock),
start(1,N,M),
%%io:format("begin send message~n"),
send1(1,M,N),
{_,Times}=statistics(wall_clock),
Times.
本人也是刚看这本书,算是erlang入门级的,第一次写博客,发现这个方法有点瑕疵,注册表是有限的,我的计算机就只允许我注册了4997,如果用{Time,Value}=timer:tc(hoop,run,[4995,1001]),结果是{13000,16},我把消息写死了,有兴趣的话可以抽取出来。