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