On Wed, 10 Nov 2010 13:33:11 -0500, Steven Schveighoffer <schvei...@yahoo.com> wrote:

On Wed, 10 Nov 2010 11:33:45 -0500, Xie <xiema...@gmail.com> wrote:

Can't run a simple program. What's wrong, GC?

import std.stdio;
import std.date;

void f0()
{
        wstring a[];

        foreach(i; 0 .. 100_000_000)
        {
                a ~= " "w;
        }
}

void main()
{
        auto r = benchmark!(f0)(1);
        writeln(r, "ms");
}

The results on my machine with 1G of memory is that it consumes 2G of memory and the system starts thrashing. I changed the value to 10_000_000, and it runs in a couple seconds, I change it to 50_000_000 and it runs in 200 seconds.

Something is definitely amiss here, because the following doesn't help (it still consumes 1.2GB of memory):

void f0()
{
        wstring a[];
        a.reserve(100_000_000);

        foreach(i; 0 .. 100_000_000)
        {
                a ~= " "w;
        }
}

This should take the explosive nature of appending out of the equation, because a reallocation should never occur.

I'll look into it.

Waaaait a second, a is not a wstring, it's an *array* of wstrings. That's completely different.

This all makes sense now. It's not 200MB, it's 800MB your code is asking for. This might be a bit much for a test, a 32-bit system only supports 4GB of address space, and usually 1GB is reserved, so you are trying to allocate about 1/3 of the memory you could possibly allocate.

Is there any reason you expect this to perform well?

-Steve

Reply via email to