Array Appending and DRuntime
dsimcha
dsimcha at yahoo.com
Sat Apr 25 13:51:15 PDT 2009
== Quote from dsimcha (dsimcha at yahoo.com)'s article
> 2. gcx.d appears to cache the last block size query. This means that
> repeatedly querying the same block in a single threaded program (where
> thread_needLock() returns false and no lock is necessary) is very fast. This
> is true in both the old Phobos GC and the druntime GC. I wonder if this was
> somehow bypassed by the ~= operator when druntime was integrated with DMD in
> its early days.
On further examination, this is clearly somehow related to caching. Here is a
very similar test program, that appends to tow arrays instead of one:
import std.stdio, std.perf;
void main() {
scope pc = new PerformanceCounter;
pc.start;
uint[] foo, bar;
foreach(i; 0..1_000_000) {
foo ~= i;
bar ~= i;
}
pc.stop;
writeln(pc.milliseconds);
}
Timings:
DMD 2.019: ~1800 ms
DMD 2.029: ~2300 ms (Note: Still slower but not by as much even in absolute terms)
DMD 2.029 (Using Appender instead of ~=): 49 ms
By appending to two arrays, we screw up the caching scheme, hence much poorer
performance. However most use cases probably involve appending to only one array
at a time. Since this is a clear regression, I'll file a bug report.
More information about the Digitalmars-d
mailing list