https://issues.dlang.org/show_bug.cgi?id=16120
Issue ID: 16120 Summary: dmd does not inline simple range primitives Product: D Version: D2 Hardware: x86_64 OS: Linux Status: NEW Severity: enhancement Priority: P1 Component: dmd Assignee: nob...@puremagic.com Reporter: greensunn...@gmail.com observation 1) dmd doesn't inline range primitives (it's 8x slower!) observation 2) foreach with direct random access is lower in dmd (30%) simple benchmark yields ``` > dmd -release -O foo.d && ./foo 0 881 ms, 351 μs, and 9 hnsecs 1 685 ms, 888 μs, and 4 hnsecs 2 685 ms, 654 μs, and 4 hnsecs 3 7 secs, 211 ms, 530 μs, and 3 hnsecs ``` for: auto f_random_access(R)(R r) { auto sum = 0; foreach (const i; 0 .. r.length) { sum += r[i]; } return sum; } auto f_foreach(R)(R r) { auto sum = 0; foreach (const el; r) { sum += el; } return sum; } auto f_foreach_ref(R)(R r) { auto sum = 0; foreach (const ref el; r) { sum += el; } return sum; } auto f_for(R)(R r) { import std.range; auto sum = 0; for (r.popFront(); !r.empty; r.popFront()) { sum += r.front; } return sum; } void main() { import std.datetime: benchmark, Duration; import std.stdio: writeln; import std.array: array; import std.conv: to; import std.random: randomShuffle; import std.range:iota; auto arr = iota(100_000).array; arr.randomShuffle; auto i = 0; void f0(){ i += arr.f_random_access; } void f1(){ i += arr.f_foreach; } void f2(){ i += arr.f_foreach_ref; } void f3(){ i += arr.f_for; } auto rs = benchmark!(f0, f1, f2, f3)(10_000); foreach(j,r;rs) writeln(j, " ", r.to!Duration); // prevent any optimization writeln(i); } --