On Sun, 03 Feb 2013 03:53:10 -0500, timotheecour <thelastmamm...@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

Reply via email to