˜q™é‡Œ
ä¸è¿‡æˆ‘分æžäº†˜q™ä¸ª‹¹‹è¯•里的Erlang代ç åQŒå˜åœ¨é—®é¢˜ï¼Œòq¶æ²¡æœ‰å®Œæˆæ‰€æœ‰çš„循环åQŒè¿›½E‹å°±¾l“æŸäº†ï¼Œ˜q™å¯¹æ¯”较¾l“果有较大的影å“。原始代ç 如下:
-module(zog).
%% This is a test program that first creates N processes (that are
%% "connected" in a ring) and then sends M messages in that ring.
%%
%% - September 1998
%% - roland
-export([start/0, start/1, start/2]).
-export([run/2, process/1]). % Local exports - ouch
start() -> start(16000).
start(N) -> start(N, 1000000).
start(N, M) -> spawn(?MODULE, run, [N, M]).
run(N, M) when N < 1 ->
io:format("Must be at least 1 process~n", []),
0.0;
run(N, M) ->
statistics(wall_clock),
Pid = setup(N-1, self()),
{_,T1} = statistics(wall_clock),
io:format("Setup : ~w s", [T1/1000]),
case N of
1 -> io:format(" (0 spawns)~n", []);
_ -> io:format(" (~w us per spawn) (~w spawns)~n",
[1000*T1/(N-1), N-1])
end,
statistics(wall_clock),
Pid ! M,
K = process(Pid),
{_,T2} = statistics(wall_clock),
Time = 1000*T2/(M+K),
io:format("Run : ~w s (~w us per msg) (~w msgs)~n",
[T2/1000, Time, (M+K)]),
Time.
setup(0, OldPid) ->
OldPid;
setup(N, OldPid) ->
NewPid = spawn(?MODULE, process, [OldPid]),
setup(N-1, NewPid).
process(Pid) ->
receive
M ->
Pid ! M-1,
if
M < 0 -> -M;
true -> process(Pid)
end
end.
我将process修改一ä¸?/span>åQ?br>
process(Pid) ->
receive
M ->
Pid ! M-1,
io:format("form ~w to ~w~n",[self(),Pid]),
if
M < 0 -> -M;
true -> process(Pid)
end
end.
ç„¶åŽæ‰§è¡Œä¸‹zog:run(3,3)åQ?span style="font-weight: bold;">ä½ å°†å‘现消毾l•了两圈ž®Þq»“æŸäº†åQŒç¬¬ä¸‰åœˆæ ÒŽœ¬æ²¡æœ‰˜q›è¡ŒåQŒä¸çŸ¥é“‹¹‹è¯•者是什么用æ„ã€?span style="font-weight: bold;">ä¾ç…§çŽ°åœ¨çš„æ‰§è¡?00万次消æ¯ä¼ é€ç«Ÿç„¶åªéœ€è¦?毫秒åQ我修改了下了下代ç 如下åQ?br>-module(zog).
%% This is a test program that first creates N processes (that are
%% "connected" in a ring) and then sends M messages in that ring.
%%
%% - September 1998
%% - roland
-export([start/0, start/1, start/2]).
-export([run/2, process/2]). % Local exports - ouch
start() -> start(16000).
start(N) -> start(N, 1000000).
start(N, M) -> spawn(?MODULE, run, [N, M]).
run(N, M) when N < 1 ->
io:format("Must be at least 1 process~n", []),
0.0;
run(N, M) ->
statistics(wall_clock),
Limit=N-N*M+1+M,
Pid = setup(N-1,Limit,self()),
{_,T1} = statistics(wall_clock),
io:format("Setup : ~w s", [T1/1000]),
case N of
1 -> io:format(" (0 spawns)~n", []);
_ -> io:format(" (~w us per spawn) (~w spawns)~n",
[1000*T1/(N-1), N-1])
end,
statistics(wall_clock),
% io:format("run's Pid=~w~n",[Pid]),
Pid ! M,
K = process(Pid,Limit),
% io:format("run's K=~w~n",[K]),
{_,T2} = statistics(wall_clock),
Time = 1000*T2/(M+K),
io:format("Run : ~w s (~w us per msg) (~w msgs)~n",
[T2/1000, Time, (M+K)]),
T2/1000.
setup(0,Limit, OldPid) ->
OldPid;
setup(N,Limit, OldPid) ->
NewPid = spawn(?MODULE, process, [OldPid,Limit]),
setup(N-1, Limit,NewPid).
process(Pid,Limit) ->
receive
M ->
Pid ! M-1,
% io:format("from ~w to ~w and M=~w~n",[self(),Pid,M]),
if
M <Limit -> -M;
true -> process(Pid,Limit)
end
end.
修改之åŽåQŒæ‰§è¡Œzog:run(3000,1000åQ‰ï¼Œä¹Ÿå°±æ˜?000个进½E‹ï¼Œ1000‹Æ¡æ¶ˆæ¯åó@环,æ€Õd…±300万次消æ¯ä¼ 递,¾l“æžœåœ?.5¿U’å·¦å»I¼Œ˜q™ä¹Ÿæ˜¯ç›¸å½“惊人的¾l“果。有人用haskellå’Œschemeå„实çŽîCº†ä¸€ä¸ªç‰ˆæœ¬ï¼Œæœ‰å…´‘£çš„看看˜q™é‡Œå’?a >˜q™é‡Œ

]]>