Memory allocation faile on string concat
Steven Schveighoffer
schveiguy at yahoo.com
Wed Nov 10 12:07:04 PST 2010
On Wed, 10 Nov 2010 14:38:02 -0500, Xie <Xiemargl at gmail.com> 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
More information about the Digitalmars-d-learn
mailing list