Erlang receive消息接收及匹配测试、=:=与==效率测试

receive消息接收及匹配测试、=:=与==效率测试


前言

整理之前学习的一些知识,未必是正确的,大家参考着看看就好。测试环境:win7系统,16G运行内存,erlang版本22.3。


一、receive消息接收及匹配测试

Pid ! Msg给进程发送消息,消息会先放到进程的邮箱中。每次接收到消息,会把邮箱的所有消息取出来进行匹配,按先进先出的原则匹配消息,因此如果有消息匹配不上将会在进程邮箱中堆积,消息匹配的效率也会越来越慢,甚至进程崩溃,所以消息匹配中可以在最后使用通配符“_ -> skip”将所有未匹配上的消息在这里匹配出来,也可以打印出来或者记录到日志中。

测试代码如下:

test(State) ->
    Pid = spawn(fun() -> matching_msg(State) end),
    Pid ! msg1,
    Pid ! msg2,
    Pid ! msg3,
    Pid ! msg4,
ok.

matching_msg(State) ->
    receive
        Msg1 when State =:= one ->
            io:format("Msg1: ~p~n", [Msg1]),
            io:format("left_msg ~p~n", [process_info(self(),messages)]),
            matching_msg(three);
        Msg2 when State =:= two ->
            io:format("Msg2: ~p~n", [Msg2]),
            io:format("left_msg ~p~n", [process_info(self(),messages)]),
            matching_msg(one);
        Msg3 when State =:= three ->
            io:format("Msg3: ~p~n", [Msg3]),
            io:format("left_msg ~p~n", [process_info(self(),messages)]),
            matching_msg(two)
    end.

代码运行结果:
Erlang receive消息接收及匹配测试、=:=与==效率测试

二、=:=与==效率测试

=:=、=/=的效率比==、/=要高一点

测试代码如下:

test2() ->
    {Time, _} = timer:tc(matching_msg, compare, [100000000]),
    io:format("Time : ~p~n", [Time]),
    {Time2, _} = timer:tc(matching_msg, compare2, [100000000]),
    io:format("Time2: ~p~n", [Time2]).

compare(0) ->
    ok;
compare(N)  when N =/= (N-1) orelse N =:= N  ->
    compare(N - 1).

compare2(0) ->
    ok;
compare2(N) when N /= (N-1) orelse N == N ->
    compare(N - 1).

代码运行结果:
Erlang receive消息接收及匹配测试、=:=与==效率测试

上一篇:RabbitMq初体验(一)安装部署


下一篇:rabbitmq云安装