天天看点

Erlang ring benchmark

    不过我分析了这个测试里的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