On Wed, 10 Nov 2010 14:38:02 -0500, Xie <[email protected]> wrote:

Sorry, it a mistypo (i began from wchar[], later changed to wstring)

Real problem can be seen here

import std.stdio;
import std.date;

void f0()
{
        wstring a;

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

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

OK, this actually makes sense to me.

It's a manifestation of this issue: http://d.puremagic.com/issues/show_bug.cgi?id=3929

In essence, in order to aid performance, there is an 8-element cache of arrays that are being appended. At the moment, the append code relies on this cache keeping the array from being collected to remain sane. However, as I wrote in the last message on that bug report, I think I can fix it so the cache is not considered a pointer to the memory, and it should be collected. But I haven't done that yet.

So what's happening in your code is the first 8 times executing that function, the memory is not collected. This results in you allocating actually 800 million wchars, or 1.6GB before anything can be collected.

So in the meantime, jump on the CC for that bug, and I hope to get to it sometime in the near future (maybe by 2.051-2.052).

-Steve

Reply via email to