You can use erlc +to_core to get the core erlang:<div><br></div><div><div>module 'test' ['is_greater_than'/2,</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> 'is_greater_than_control'/2,</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span> 'is_true'/1,</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> 'module_info'/0,</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> 'module_info'/1]</div>
<div> attributes []</div><div>'is_true'/1 =</div><div> %% Line 5</div><div> fun (_cor0) -></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>case _cor0 of</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> <'true'> when 'true' -></div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span> %% Line 6</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> 'true'</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> %% Line 7</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span> <'false'> when 'true' -></div><div><span class="Apple-tab-span" style="white-space:pre"> </span> %% Line 8</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> 'false'</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span> ( <_cor1> when 'true' -></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>( primop 'match_fail'</div><div>
<span class="Apple-tab-span" style="white-space:pre"> </span> ({'function_clause',_cor1})</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> -| [{'function_name',{'is_true',1}}] )</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span> -| ['compiler_generated'] )</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>end</div><div>'is_greater_than'/2 =</div>
<div> %% Line 10</div><div> fun (_cor1,_cor0) -></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>let <_cor2> =</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> %% Line 11</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span> call 'erlang':'>'</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>(_cor1, _cor0)</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>in %% Line 11</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span> apply 'is_true'/1</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>(_cor2)</div><div>'is_greater_than_control'/2 =</div>
<div> %% Line 13</div><div> fun (_cor1,_cor0) -></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>%% Line 15</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>case <> of</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span> %% Line 16</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> <></div><div><span class="Apple-tab-span" style="white-space:pre"> </span> when call 'erlang':'>'</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span> (_cor1,</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> _cor0) -></div><div><span class="Apple-tab-span" style="white-space:pre"> </span> %% Line 17</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span> 'true'</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> %% Line 18</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> <> when 'true' -></div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span> %% Line 19</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> 'false'</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>end</div>
<div>'module_info'/0 =</div><div> fun () -></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>call 'erlang':'get_module_info'</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> ('test')</div>
<div>'module_info'/1 =</div><div> fun (_cor0) -></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>call 'erlang':'get_module_info'</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> ('test', _cor0)</div>
<div>end</div><br><div class="gmail_quote">On Mon, Aug 27, 2012 at 5:44 PM, Jayson Barley <span dir="ltr"><<a href="mailto:jayson.barley@gmail.com" target="_blank">jayson.barley@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
That is interesting. I didn't know that. I wonder why over 100 million iterations I consistently get between 1 to 2 second differences in timing. I know that there will be differences due to garbage collection, other processes running, etc, but the is_greater_than_control/2 function always outperforms the is_greater_than/2 function. Am I making a wrong assumption and eventually the opposite would be true? Could you test the below code on your system and let me know if you get similar results? <br>
<br>-module(test).<br>-compile(export_all).<div class="im"><br><br>is_true(true) -><br> true;<br>is_true(false) -><br> false.<br><br>is_greater_than(X, Y) -><br> is_true(X>Y).<br><br></div>is_greater_than_control(X, Y) -><div class="im">
<br>
if<br> X>Y -><br> true;<br> true -> % works as an 'else' branch<br> false<br> end.<br><br></div>test_if(X, X, _) -><br> done;<br>test_if(X, Max, Fun) -><br>
Fun(X, Max),<br>
test_if(X + 1, Max, Fun).<br><br>test_if(Max) -><br> [timer:tc(test, test_if, [0, Max, fun is_greater_than/2]), timer:tc(test, test_if, [0, Max, fun is_greater_than_control/2])].<br><br>8> test:test_if(100000000).<br>
[{7234000,done},{5718999,done}]<div class="HOEnZb"><div class="h5"><br><br><div class="gmail_quote">On Mon, Aug 27, 2012 at 2:00 PM, Andrzej Sliwa <span dir="ltr"><<a href="mailto:andrzej.sliwa@i-tool.eu" target="_blank">andrzej.sliwa@i-tool.eu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">there is no difference in speed at all,<br>
<div><br>
> switch_signal({signal, _What, _From, _To}) -><br>
> true;<br>
> switch_signal({signal, _What, _To}) -><br>
> true;<br>
> switch_signal(_Else) -><br>
> false.<br>
<br>
</div>is compiled internally to one function with case<br>
so code speed is equal<br>
<br>
there is only difference in readability.<br>
<div><div><br>
On Aug 27, 2012, at 10:56 PM, Jayson Barley <<a href="mailto:jayson.barley@gmail.com" target="_blank">jayson.barley@gmail.com</a>> wrote:<br>
<br>
> I am not sure I understand why we have them. For instance I can take the following code<br>
> is_greater_than(X, Y) -><br>
> if<br>
> X>Y -><br>
> true;<br>
> true -> % works as an 'else' branch<br>
> false<br>
> end.<br>
> And make it<br>
> is_true(true) -><br>
> true;<br>
> is_true(false) -><br>
> false.<br>
><br>
> is_greater_than(X, Y) -><br>
> is_true(X>Y).<br>
> I can do the same thing with case statements<br>
> is_valid_signal(Signal) -><br>
> case Signal of<br>
> {signal, _What, _From, _To} -><br>
> true;<br>
> {signal, _What, _To} -><br>
> true;<br>
> _Else -><br>
> false<br>
> end.<br>
> Becomes<br>
> switch_signal({signal, _What, _From, _To}) -><br>
> true;<br>
> switch_signal({signal, _What, _To}) -><br>
> true;<br>
> switch_signal(_Else) -><br>
> false.<br>
><br>
> is_valid_signal(Signal) -><br>
> switch_signal(Signal).<br>
><br>
> I know that the control structures are a little bit faster, not much, but I find that the function form is more readable.<br>
</div></div><div><div>> _______________________________________________<br>
> erlang-questions mailing list<br>
> <a href="mailto:erlang-questions@erlang.org" target="_blank">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>
</div></div></blockquote></div><br>
</div></div><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></blockquote></div><br></div>