[erlang-questions] Erlang shows its slow face!

Bernard Duggan bernie@REDACTED
Sat Nov 13 09:39:59 CET 2010


On 13/11/10 18:37, Gilberto Carmenate García 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.
>    
Okay, the first and most obvious improvement to that code above is to 
change it slightly to:

pythag(N) ->
     L = lists:seq(1,N),
     [ {A,B,C} ||
         A <- L,
         B <- L,
         C <- L,
         A+B+C =< N,
         A*A+B*B =:= C*C].

That sped it up on my laptop from 4 seconds to 3.5. If you're really 
after speed in erlang, though, a good thing to try is HiPE. Add 
"+native" to your erlc command options. That sped it up (for me) to 1 
second for your code and .5 of a second for my version.  Bear in mind 
that HiPE carries tradeoffs in terms of tracing/debugging etc.

As far as your question, though, the first thing I'd say is that if 
you're using Erlang for high-performance numerical analysis, you've 
chosen the wrong language. I love Erlang to bits, but that's not its 
strength. Part of this stems from the fact that when you have a number 
(A, B, C), it's always treated as an having an arbitrary size (people 
more familiar with the guts of the VM please feel free to correct me 
here...). That means that if you want to store more than 32 or 64 bits 
in it, you can do so with zero modification to your code. That's 
brilliant and can be really useful, but the tradeoff is the performance 
hit you take on any arithmetic operation - and it's that hit, I suspect, 
that you're seeing here.

Cheers,

B


More information about the erlang-questions mailing list