why does array appending add a page size instead of doubling ?
Steven Schveighoffer
schveiguy at yahoo.com
Sun Feb 3 03:47:22 PST 2013
On Sun, 03 Feb 2013 03:53:10 -0500, timotheecour
<thelastmammoth at gmail.com> wrote:
>> Note that dynamic arrays are generic containers, so they aren't exactly
>> optimized for anything. You could try that test with the "made for
>> appending" std.array.appender: It always tries to extend without
>> reallocating, and only relocates when the current memory segment is
>> 100% full.
>>
>> Furthermore, when it *does* relocate, it use D-style memmove without
>> calling postblit. Independent of language, and with the requirement of
>> contiguous memory, I can't really think of a scheme that could be
>> better than that...?
>
>
> modified a bit (see below) to include timing etc. I'm on OSX (16GB ram,
> core i7 2.3GHz).
> dmd is slow even with optimizations so I used ldc:
>
> ldmd2 -inline -O -release -noboundscheck (similar results with ldc2 -O3
> -release)
> for C++: g++ -O2
>
> It seems that:
> * the number of moves is up to 2x (resp. 1.8x) as the C++ version for
> T[] (resp. appender)
> * the C++ version is 7x (resp 1.8x) times faster .
> * it seems even the appender version grows super-linearly whereas C++
> version stays roughly linear in that regime in terms of time.
>
> Based on this, I'm curious whether the current growing scheme could be
> improved, or be closer to the simple doubling scheme used in C++.
The performance increase is due to a) using malloc instead of GC
allocation, which would run quite a few collection cycles while
allocating. If you profile the D code, you will see this. b) vector is
FREEING its previously used array space, D array appending is relying on
the GC to free that space. The consumed D space will grow more rapidly.
You are essentially comparing apples to oranges here.
-Steve
More information about the Digitalmars-d-learn
mailing list