个人求解编写一个环形基准测试。在一个环中创建N个进程。然后沿着环发送一条消息M次,最后总共发送N*M条消息,在N和M的不同取值下测试整个过程会消耗多长时间。

本文介绍了如何使用Erlang编程语言实现并优化一个环形基准测试,通过创建多个进程在环中进行消息传递,以此评估不同参数组合下的性能表现。重点在于展示如何在有限注册表的情况下进行高效的消息发送与接收,同时提供了针对测试结果的分析与改进策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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},我把消息写死了,有兴趣的话可以抽取出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值