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.
代码运行结果:
二、=:=与==效率测试
=:=、=/=的效率比==、/=要高一点
测试代码如下:
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).
代码运行结果: