On Wed, 14 Apr 2010 17:19:53 -0400, Joseph Wakeling <joseph.wakel...@webdrake.net> wrote:

/////////////////////////////////////////////////////////////////////////
version(Tango) {
    import tango.stdc.stdio: printf;
} else {
    import std.stdio: printf;
}

void main()
{
    double[] x;

    for(uint i=0;i<100;++i) {
        x.length = 0;

        for(uint j=0;j<5_000;++j) {
            for(uint k=0;k<1_000;++k) {
                x ~= j*k;
            }
        }

        printf("At iteration %u, x has %u elements.\n",i,x.length);
    }
}
/////////////////////////////////////////////////////////////////////////

I noticed that when compiled with LDC the memory usage stays constant,
but in DMD the memory use blows up.  Is this a D1/D2 difference (with D2
having the more advanced features that require preservation of memory)
or is it a bug in one or the other of the compilers ... ?

It is because D2 is more advanced in preserving memory. In D1, setting length to zero is equivalent to also assuming it can append safely.

One thing I forgot about, there is currently a design flaw in D2 array appending which will keep around a certain number of arrays even after all references have been removed (i.e. the arrays should be collectable, but they are not collected by the GC). I have a clear path on how to fix that, but I haven't done it yet.

See this bugzilla report: http://d.puremagic.com/issues/show_bug.cgi?id=3929

This might also help explain why the memory blows up.

-Steve

Reply via email to