# [erlang-questions] eep: multiple patterns

Christopher Atkins <>
Sat May 31 03:02:45 CEST 2008

```Hello, I tried (poorly--I'm a complete novice) to implement a benchmark from
your earlier statement.  I didn't do the same thing (load up the message
mailbox before consuming them), but what I did write led to a perplexing (to
me) discovery.  If I uncomment the line in [loop1/0] below, performance for
that loop degrades by an order of magnitude.  Why is that?

-compile(export_all).

start() ->
statistics(runtime),
statistics(wall_clock),
PidLoop1 = spawn(?MODULE, loop1,[]),
sender(PidLoop1, 10000000),
{_, Loop1Time1} = statistics(runtime),
{_, Loop1Time2} = statistics(wall_clock),
io:format("Sent ~p messages in ~p /~p~n", [100000, Loop1Time1,
Loop1Time2]),
statistics(runtime),
statistics(wall_clock),
PidLoop2 = spawn(?MODULE, loop2,[]),
sender(PidLoop2, 10000000),
{_, Loop2Time1} = statistics(runtime),
{_, Loop2Time2} = statistics(wall_clock),
io:format("Sent ~p messages in ~p /~p~n", [100000, Loop2Time1,
Loop2Time2]).

sender(_, 0) -> void;
sender(Pid, N) ->
if
N rem 2 =:= 2 ->
Pid ! test2;
true ->
Pid ! test1
end,
sender(Pid, N - 1).

proc1(F) ->
end.

loop1() ->
%%test1 -> loop1();
test2 -> loop1()
end.

loop2() ->
_ -> loop2()
end.

------------------------------------------------------------------------------------------------------------------------------
Message: 2
Date: Fri, 30 May 2008 18:07:18 +0200
From: "Per Melin" <>
Subject: Re: [erlang-questions] eep: multiple patterns
To: "Sean Hinde" <>
Cc: Erlang Questions <>
Message-ID:
<>
Content-Type: text/plain; charset=ISO-8859-1

2008/5/30 Per Melin <>:
> If I send 100k 'foo' messages and then 100k 'bar' messages to a
> process, and then do a catch-all receive until there are no messages
> left, that takes 0.03 seconds.
>
> If I do a selective receive of only the 'bar' messages, it takes 90
seconds.

I found my old test code:

-module(selective).

-export([a/2, c/2]).

a(Atom, N) ->
spawn(fun() -> b(Atom, N) end).

b(Atom, N) ->
spam_me(foo, N),
spam_me(bar, N),
R = timer:tc(?MODULE, c, [Atom, N]),
io:format("TC: ~p~n", [R]).

c(Atom, N) ->
Atom -> c(Atom, N - 1)
after 0 ->
N
end.

spam_me(Msg, Copies) ->
lists:foreach(fun(_) -> self() ! Msg end, lists:duplicate(Copies, 0)).

---

2> selective:a(bar, 100000).
<0.38.0>
TC: {124130689,0}
3> selective:a(foo, 100000).
<0.40.0>
TC: {23176,0}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20080530/c77a0c01/attachment.html>
```