http://d.puremagic.com/issues/show_bug.cgi?id=2900
Summary: Array appending slowed drastically since integration of
druntime
Product: D
Version: 2.020
Platform: PC
OS/Version: Windows
Status: NEW
Severity: regression
Priority: P2
Component: DMD
AssignedTo: [email protected]
ReportedBy: [email protected]
Test program:
import std.stdio, std.perf;
void main() {
scope pc = new PerformanceCounter;
pc.start;
uint[] foo;
foreach(i; 0..1_000_000) {
foo ~= i;
}
pc.stop;
writeln(pc.milliseconds);
}
Timings:
DMD 2.019 (Last release before druntime): 42 milliseconds.
DMD 2.020 (First release with druntime): ~1000 milliseconds.
DMD 2.029 (Current version): ~1000 milliseconds.
DMD 2.029 (Replacing ~= with the Appender struct): 18 milliseconds.
DMD 2.029 (Replacing builtin array with rangeextra.TNew): 19 milliseconds.
This looks to be related to the block size caching scheme used by gcx.d. When
appending to two arrays simultaneously, the difference between 2.019 and 2.029
is much smaller, both in absolute and especially in relative terms:
Program:
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
--