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