[erlang-questions] Erlang shows its slow face!
Edmond Begumisa
ebegumisa@REDACTED
Sun Nov 14 17:02:50 CET 2010
Willem's version in parallel below using a maximum of 2000 concurrent
processes (find lpmap function is in previous e-mail).
This is approx. 16 x faster on my dual-core. Probably surpasses C# already
(but again, not really a good point to try to be making.)
pythag2(N) ->
L = [{A, A*A} || A <- lists:seq(1,N)], % For all A's
lists:flatten(lpmap(fun({A, A2}) -> % For all B's in parallel
[forAllCs(A, B, A + B, A2 + B2, L, N)
|| {B, B2} <- L, A + B < N]
end, L, 2000, ordered)).
forAllCs(A, B, AB, A2B2, L, N) ->
[{A, B, C} || {C, C2} <- L, A2B2 =:= C2, AB + C =< N].
- Edmond -
On Sun, 14 Nov 2010 19:52:47 +1100, Willem de Jong <w.a.de.jong@REDACTED>
wrote:
> Hi,
>
> I think the key is to minimize the number of calculations and
> comparisons.
> In your version you do a lot of multiplications that can easily be
> avoided.
>
> The version below is about 10 x as fast on my PC:
>
> pythag2(N) ->
> L = [{A, A*A} || A <- lists:seq(1,N)],
> lists:flatten([forAllBs(A, A2, L, N) || {A, A2} <- L]).
>
> forAllBs(A, A2, L, N) ->
> [forAllCs(A, B, A + B, A2 + B2, L, N) || {B, B2} <- L, A + B < N].
>
> forAllCs(A, B, AB, A2B2, L, N) ->
> [{A, B, C} || {C, C2} <- L, A2B2 =:= C2, AB + C =< N].
>
> Regards,
> Willem
>
> On Sat, Nov 13, 2010 at 8:37 AM, Gilberto Carmenate García <
> co7eb@REDACTED> wrote:
>
>> Hi all!
>> I have been doing tests to Erlang I found this funny stuff that makes
>> Pythagorean Triplets
>>
>> pythag(N) ->
>> [ {A,B,C} ||
>> A <- lists:seq(1,N),
>> B <- lists:seq(1,N),
>> C <- lists:seq(1,N),
>> A+B+C =< N,
>> A*A+B*B =:= C*C].
>>
>> I tested it agains an implementation I made in C# so, and takes 14
>> secounds in my pc to do with 300 numbers in Erlang however in c# is just
>> a secound, even when C# runs under VM too.
>> So I did all possible ways for me to implement differents manners in
>> Erlang looking for speed and all is the same, listed as follows:
>>
>> So my question is, there are any way to do that even more fast, why 3
>> nestes fors structs in C# are more effients that lists:foldr or
>> lists:foreach in Erlang.
>>
>> %% FORMA 1
>> py1(Max)->
>> L = lists:seq(1, Max),
>> lists:foldr(
>> fun(A, Acc3)->
>> lists:foldr(
>> fun(B, Acc2)->
>> lists:foldr(
>> fun(C, Acc)->
>> case ((A*A + B*B =:= C*C) andalso (A+B+C =<
>> Max)) of
>> true->
>> [{A,B,C}|Acc];
>> false->
>> Acc
>> end
>> end
>> , Acc2, L)
>> end
>> , Acc3, L)
>> end
>> , [], L).
>>
>>
>>
>> %% FORMA 2
>> py2(Max)->
>> fora(1, [], Max).
>>
>> fora(A, Acc, Max)->
>> Acc1 = forb(A,1, Acc, Max),
>> case A < Max of
>> true->
>> fora(A+1, Acc1, Max);
>> false->
>> Acc1
>> end.
>>
>> forb(A,B, Acc, Max)->
>> Acc1 = forc(A,B,1, Acc, Max),
>> case B < Max of
>> true->
>> forb(A,B+1, Acc1, Max);
>> false->
>> Acc1
>> end.
>>
>> forc(A,B,C, Acc, Max)->
>> Acc1 = case (A*A + B*B =:= C*C) andalso (A+B+C =< Max) of
>> true->
>> [{A,B,C}|Acc];
>> _->
>> Acc
>> end,
>> case C < Max of
>> true->
>> forc(A,B,C+1, Acc1, Max);
>> false->
>> Acc1
>> end.
>>
>> %% FORMA 3.
>> py3(Max)->
>> [{A,B,C} ||
>> A <-lists:seq(1, Max),
>> B <-lists:seq(1, Max),
>> C <-lists:seq(1, Max),
>> A*A + B*B =:= C*C,
>> A+B+C =< Max].
>>
>>
>> =======================================================================
>> Este mensaje ha sido enviado mediante el servicio de correo electronico
>> que
>> ofrece la Federacion de Radioaficionados de Cuba a sus miembros para
>> respaldar el cumplimiento de los objetivos de la organizacion y su
>> politica
>> informativa. La persona que envia este correo asume el compromiso de
>> usar
>> el servicio a tales fines y cumplir con las regulaciones establecidas.
>>
>>
>>
>> ________________________________________________________________
>> erlang-questions (at) erlang.org mailing list.
>> See http://www.erlang.org/faq.html
>> To unsubscribe; mailto:erlang-questions-unsubscribe@REDACTED
>>
>>
--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
More information about the erlang-questions
mailing list