<div dir="ltr">A performance difference between case and functions can manifest when you extract a case from a function into another function. Function calls aren't free unless they get inlined.</div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Thu, Mar 7, 2013 at 10:02 AM, Robert Virding <span dir="ltr"><<a href="mailto:robert.virding@erlang-solutions.com" target="_blank">robert.virding@erlang-solutions.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Just to explain *why* Garret's example produces the same code. Internally the compiler uses the same code to handle the pattern matching in function clauses and in case clauses so the result is naturally the same. So to reinforce what Garret said: choose that which feels the best.<br>

<br>
Some personal comments:<br>
<br>
- Sometimes it does feel a bit excessive to create small functions for everything even if it more pure.<br>
- If you want to pattern match on multiple values it looks much better in a separate function.<br>
<span class="HOEnZb"><font color="#888888"><br>
Robert<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
----- Original Message -----<br>
> From: "Garrett Smith" <<a href="mailto:g@rre.tt">g@rre.tt</a>><br>
> To: "饕餮" <<a href="mailto:249505968@qq.com">249505968@qq.com</a>><br>
> Cc: "erlang-questions" <<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a>><br>
> Sent: Thursday, 7 March, 2013 5:34:48 PM<br>
> Subject: Re: [erlang-questions] Which choice is better? Function or Case<br>
><br>
> On Thu, Mar 7, 2013 at 3:11 AM, 饕餮 <<a href="mailto:249505968@qq.com">249505968@qq.com</a>> wrote:<br>
> > I wonder if Function call is better than Case when both of they can<br>
> > implement the target I want?<br>
> > It seems like  write a function instead of case could make the code<br>
> > more<br>
> > clear .<br>
> > But which one is fast when it running?<br>
> > I intend to change the case to function to make the code more<br>
> > clear. Is this<br>
> > valuable?<br>
><br>
> Here's a module:<br>
><br>
> %% == begin ===========================<br>
><br>
> -module(case_vs_function).<br>
><br>
> -export([with_case/1, with_function/1]).<br>
><br>
> with_case(Msg) -><br>
>     case Msg of<br>
>         "hello" -> {ok, hi};<br>
>         "goodbye" -> {ok, bye};<br>
>         _ -> error<br>
>     end.<br>
><br>
> with_function("hello") -> {ok, hi};<br>
> with_function("goodbye") -> {ok, bye};<br>
> with_function(_) -> error.<br>
><br>
> %% == end =============================<br>
><br>
> And here's the compiled core Erlang:<br>
><br>
> %% == begin ===========================<br>
><br>
> module 'case_vs_function' ['module_info'/0,<br>
>                            'module_info'/1,<br>
>                            'with_case'/1,<br>
>                            'with_function'/1]<br>
>     attributes []<br>
> 'with_case'/1 =<br>
>     %% Line 5<br>
>     fun (_cor0) -><br>
>         %% Line 6<br>
>         case _cor0 of<br>
>           %% Line 7<br>
>           <[104|[101|[108|[108|[111]]]]]> when 'true' -><br>
>               {'ok','hi'}<br>
>           %% Line 8<br>
>           <[103|[111|[111|[100|[98|[121|[101]]]]]]]> when 'true' -><br>
>               {'ok','bye'}<br>
>           %% Line 9<br>
>           <_cor3> when 'true' -><br>
>               'error'<br>
>         end<br>
> 'with_function'/1 =<br>
>     %% Line 12<br>
>     fun (_cor0) -><br>
>         case _cor0 of<br>
>           <[104|[101|[108|[108|[111]]]]]> when 'true' -><br>
>               {'ok','hi'}<br>
>           %% Line 13<br>
>           <[103|[111|[111|[100|[98|[121|[101]]]]]]]> when 'true' -><br>
>               {'ok','bye'}<br>
>           %% Line 14<br>
>           <_cor2> when 'true' -><br>
>               'error'<br>
>         end<br>
> 'module_info'/0 =<br>
>     fun () -><br>
>         call 'erlang':'get_module_info'<br>
>             ('case_vs_function')<br>
> 'module_info'/1 =<br>
>     fun (_cor0) -><br>
>         call 'erlang':'get_module_info'<br>
>             ('case_vs_function', _cor0)<br>
> end<br>
><br>
> %% == end =============================<br>
><br>
> And the same core Erlang with distractions removed:<br>
><br>
> %% == begin ===========================<br>
><br>
> 'with_case'/1 =<br>
>     fun (_cor0) -><br>
>         case _cor0 of<br>
>           <[104|[101|[108|[108|[111]]]]]> when 'true' -><br>
>               {'ok','hi'}<br>
>           <[103|[111|[111|[100|[98|[121|[101]]]]]]]> when 'true' -><br>
>               {'ok','bye'}<br>
>           <_cor3> when 'true' -><br>
>               'error'<br>
>         end<br>
><br>
> 'with_function'/1 =<br>
>     fun (_cor0) -><br>
>         case _cor0 of<br>
>           <[104|[101|[108|[108|[111]]]]]> when 'true' -><br>
>               {'ok','hi'}<br>
>           <[103|[111|[111|[100|[98|[121|[101]]]]]]]> when 'true' -><br>
>               {'ok','bye'}<br>
>           <_cor2> when 'true' -><br>
>               'error'<br>
>         end<br>
><br>
> %% == end =============================<br>
><br>
> This should alleviate any guilt you may have over using functions,<br>
> instead of case expressions, to make your code more obvious.<br>
><br>
> Garrett<br>
> _______________________________________________<br>
> erlang-questions mailing list<br>
> <a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
> <a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
><br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br></div>