<br>It seems counter-intuitive at first, doesn't it? (:<br>Adding checking to the code shouldn't speed things up,<br>but the thing is that, being dynamically typed, Erlang will<br>have to do type checking in all the multiplications, etc,
<br>checking first the operands, and then the result.<br><br>But if the compiler can deduce (because of the guards)<br>what the type signature is, it can generate much more <br>efficient code, foregoing redundant type checks.
<br><br>I think(*) it's pretty much generally true that adding type <br>guards never slows things down, but adds compile-time <br>info that can be used by Dialyzer as well as in some <br>optimizations.<br><br>(*) This is to say that I'm guessing this is the case. It _seems_ true.
<br><br>BR,<br>Ulf W<br><br><div><span class="gmail_quote">2007/6/5, Jim Menard <<a href="mailto:jim.menard@gmail.com">jim.menard@gmail.com</a>>:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
On 6/4/07, Ulf Wiger (TN/EAB) <<a href="mailto:ulf.wiger@ericsson.com">ulf.wiger@ericsson.com</a>> wrote:<br>><br>> I ran it on my machine, which scored a miserable<br>> 4.2 seconds. Adding is_float/1 guards around all
<br>> variables that are floats (quite a few) and<br>> compiling with native brought it down to 1.8 secs.<br><br>It sped up my version considerably as well. Why is that? I thought<br>that a guard clause was only used to select which function clause to
<br>run. How does checking to see if something is a float make things<br>faster instead of slowing it down by having to execute is_float/1 for<br>each call?<br><br>><br>> My screen IO is really bad, since I use VNC over
<br>> an IPSec tunnel on ADSL, so I did a little<br>> optimization of the screen output as well.<br>><br>> Originally, you didn't have to call lists:map/2,<br>> since you only called io:format/2, thus returning
<br>> 'ok' in each iteration. lists:foreach/2 would have<br>> done fine (not that it would have changed the<br>> timing much). But io:format/2 makes a synchronous<br>> call to an IO server each time, so making plot/2
<br>> return a character, and using map to build a<br>> string, lets you call io:format() once for each<br>> line instead of once per character. I messed up<br>> the measurements in the end, so I don't know if
<br>> this was the cause of halving the wall_clock<br>> time, which I observed, or whether it was<br>> something else.<br>><br>> Personally, when benchmarking stuff, I tend to<br>> run several times and pick the smallest value,
<br>> reasoning that the other timings included more<br>> noise.<br>><br>> BR,<br>> Ulf W<br>><br>> -module(fractal_benchmark).<br>> -author("Jim Menard, <a href="mailto:jimm@io.com">jimm@io.com
</a>").<br>> -export([run/0]).<br>><br>> -define(BAILOUT, 16).<br>> -define(MAX_ITERATIONS, 1000).<br>><br>> %% Idea from <a href="http://www.timestretch.com/FractalBenchmark.html">http://www.timestretch.com/FractalBenchmark.html
</a><br>><br>> run() -><br>>     io:format("Rendering~n"),<br>>     statistics(runtime),<br>>     statistics(wall_clock),<br>>     Seq = lists:seq(-39,39),<br>>     lists:foreach(fun(Y) ->
<br>>                           S = lists:map(fun(X) -> plot(X, Y) end, Seq),<br>>                           io:format("~s~n", [S])<br>>                   end, Seq),<br>>     io:format("~n"),
<br>>     {_, Time1} = statistics(runtime),<br>>     {_, Time2} = statistics(wall_clock),<br>>     Sec1 = Time1 / 1000.0,<br>>     Sec2 = Time2 / 1000.0,<br>>     io:format("Erlang Elapsed ~p (runtime) ~p (wall clock) seconds~n",
<br>>               [Sec1, Sec2]).<br>><br>> plot(X, Y) -><br>>     case iterate(X/40.0, Y/40.0) of<br>>         0 -><br>>             42;  % ASCII for *<br>>         _ -><br>>             32   % ASCII for space
<br>>     end.<br>><br>> iterate(X, Y)<br>>   when is_float(X), is_float(Y) -><br>>     CR = Y - 0.5,<br>>     CI = X,<br>>     iter_value(CR, CI, 0.0, 0.0, 0.0, 0.0, 0).<br>><br>> iter_value(_, _, _, _, _, _, I) when I > ?MAX_ITERATIONS ->
<br>>     0;<br>> iter_value(_, _, _, ZI2, _, ZR2, I)<br>>   when is_float(ZI2), is_float(ZR2), ZI2 + ZR2 > ?BAILOUT -><br>>     I;<br>> iter_value(CR, CI, ZI, ZI2, ZR, ZR2, I)<br>>   when is_float(CR), is_float(ZI), is_float(ZI2), is_float(ZR),
<br>> is_float(ZR2) -><br>>     Temp = ZR * ZI,<br>>     ZRnew = ZR2 - ZI2 + CR,<br>>     ZInew = Temp + Temp + CI,<br>>     iter_value(CR, CI, ZInew, ZInew * ZInew, ZRnew, ZRnew * ZRnew, I +<br>> 1).
<br>><br>> > -----Original Message-----<br>> > From: <a href="mailto:erlang-questions-bounces@erlang.org">erlang-questions-bounces@erlang.org</a><br>> > [mailto:<a href="mailto:erlang-questions-bounces@erlang.org">
erlang-questions-bounces@erlang.org</a>] On Behalf Of Jim Menard<br>> > Sent: den 4 juni 2007 14:34<br>> > To: <a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>> > Subject: [erlang-questions] Blog: Erlang Fractal Benchmark
<br>> ><br>> > I've just posted "Erlang Fractal Benchmark" at<br>> > <a href="http://jimmenard.blogspot.com/2007/06/erlang-fractal-benchmark.html">http://jimmenard.blogspot.com/2007/06/erlang-fractal-benchmark.html
</a>.<br>> > Any comments on the code are much appreciated.<br>> ><br>> > Jim<br>> > --<br>> > Jim Menard, <a href="mailto:jimm@io.com">jimm@io.com</a>, <a href="mailto:jim.menard@gmail.com">
jim.menard@gmail.com</a><br>> > <a href="http://www.io.com/~jimm/">http://www.io.com/~jimm/</a><br>> > _______________________________________________<br>> > erlang-questions mailing list<br>> > <a href="mailto:erlang-questions@erlang.org">
erlang-questions@erlang.org</a><br>> > <a href="http://www.erlang.org/mailman/listinfo/erlang-questions">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br>> ><br>><br><br><br>--<br>Jim Menard, 
<a href="mailto:jimm@io.com">jimm@io.com</a>, <a href="mailto:jim.menard@gmail.com">jim.menard@gmail.com</a><br><a href="http://www.io.com/~jimm/">http://www.io.com/~jimm/</a><br>_______________________________________________
<br>erlang-questions mailing list<br><a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br><a href="http://www.erlang.org/mailman/listinfo/erlang-questions">http://www.erlang.org/mailman/listinfo/erlang-questions
</a><br></blockquote></div><br>