不过我分析了这个测试里的erlang代码,存在问题,并没有完成所有的循环,进程就结束了,这对比较结果有较大的影响。原始代码如下:
我将process修改一下:
然后执行下zog:run(3,3),你将发现消息绕了两圈就结束了,第三圈根本没有进行,不知道测试者是什么用意。依照现在的执行300万次消息传送竟然只需要3毫秒!我修改了下了下代码如下:
-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,
% 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.
文章转自庄周梦蝶 ,原文发布时间2007-08-04