Erlang shows its slow face!

Gilberto Carmenate García co7eb@REDACTED
Sat Nov 13 08:37:08 CET 2010


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.




More information about the erlang-questions mailing list