[erlang-questions] garbage collection questions

Doug Currie doug.currie@REDACTED
Mon Oct 1 23:37:14 CEST 2007


Hi,

Digging into Erlang a bit, I was dismayed by the use of get & put in
the shootout benchmark nsieve
http://shootout.alioth.debian.org/gp4/benchmark.php?test=nsieve&lang=hipe&id=0

I noted the use of ets and then hipe bytearray in
http://www.nabble.com/shootout---nsieve-bits-benchmark-t1487923.html

But I am running on Windows, so no HiPE :-(

Evaluating the use of integers to replace bytearray just for fun (I
was not expecting it to be competitive), I ran into GC problems.

Here is the code:

main(N) when N >= 2 -> gcst(), ns(N), gcst(), gcst(), ns(N-1), gcst(), ns(N-2), gcst().

gcst() -> 
    io:fwrite("GC: ~p~n", [statistics(garbage_collection)]). 

ns(N) ->
    M = (1 bsl N)*10000,
    io:fwrite("Primes up to ~8.10B ~8.10B~n", [M, ns(0, 2, M, 0)]).

ns(_, I, M, C) when I > M -> C;
ns(B, I, M, C) ->
    case is_prime(B, I) of
        true  -> ns(mark(B, I, M, I+I), I+1, M, C+1);
        false -> ns(B, I+1, M, C)
    end.

mark(B, _, M, K) when K > M -> B;
mark(B, I, M, K) -> mark(not_prime(B, K), I, M, K+I).

is_prime(B, I) ->  0 =:= ((1 bsl I) band B).

not_prime(B, K) -> ((1 bsl K) bor B).

%%%

Here is what happens:

Erlang (BEAM) emulator version 5.5.5 [async-threads:0]

Eshell V5.5.5  (abort with ^G)
1> cd("../../../..").
C:/Dev/cean
ok
2> c(nsieve_e).
{ok,nsieve_e}
3> timer:tc(nsieve_e,main,[6]).
GC: {412,513637,0}
Primes up to   640000    52074
GC: {4540,144952244,0}
GC: {4541,144952601,0}
Primes up to   320000    27608
GC: {6659,4192756888,0}
Primes up to   160000    14683
GC: {7400,4055981814,0}
{858925000,ok}
4> timer:tc(nsieve_e,main,[7]).
GC: {7410,4055985246,0}

Crash dump was written to: erl_crash.dump
eheap_alloc: Cannot allocate 373662860 bytes of memory (of type "heap").


Abnormal termination

%%

The code produces the correct answers (slowly), and should not
accumulate garbage since the loops are all tail recursive.

Two questions:

Why isn't the garbage being collected inside my ns (or mark) loop?

How does the Words_Reclaimed go down between:

GC: {6659,4192756888,0}
Primes up to   160000    14683
GC: {7400,4055981814,0}

?

Thanks.

e

-- 
Doug Currie
Londonderry, NH, USA




More information about the erlang-questions mailing list