dsimcha: > Rule number 1 of all performance discussions: Always measure if possible.
Very good, thank you. I have run your code, with a bit of changes: import std.stdio: writeln; import std.perf: PerformanceCounter; enum uint N = 1_000_000_000; struct Direct { uint n; uint front() { return n; } void popFront() { n++; } bool empty() { return n >= N; } } struct Apply { int opApply(int delegate(ref uint) dg) { int res; foreach (i; 0U .. N) { res = dg(i); if(res) break; } return res; } } class Virtual { uint n; uint front() { return n; } void popFront() { n++; } bool empty() { return n >= N; } } void main() { scope pc = new PerformanceCounter; pc.start; foreach (elem; Direct.init) {} pc.stop; writeln("Direct: ", pc.milliseconds); pc.start; foreach (elem; Apply.init) {} pc.stop; writeln("opApply: ", pc.milliseconds); pc.start; auto v = new Virtual; foreach (elem; v) {} pc.stop; writeln("Virtual: ", pc.milliseconds); pc.start; scope auto v2 = new Virtual; foreach (elem; v2) {} pc.stop; writeln("Scoped virtual: ", pc.milliseconds); } As you see I have added a version with scoped class at the bottom hoping to improve performance a bit, but the result is the opposite, can you explain me why? Direct: 2699 opApply: 3520 Virtual: 7543 Scoped virtual: 8550 Run on a Core2 2 GHz, on WinXP. Bye, bearophile