On Sunday, 24 August 2025 at 08:35:57 UTC, Per Nordlöw wrote:
Which are the pros and cons of foreach vs static foreach on a compile time tuple in D in terms of compiler performance and resource usage? Does static foreach generate more ast duplications?
Since enum foreach is being deleted and nore properly implimented (ugh that not why I report bugs; to remove features) I believe in practice both should be O(n) but there isnt a way to generate a alias foreach lazily, it will exist in memory so it must allocate O(n)
I would predict that alias foreach will be 2x slower until your ram is filled at a point 1/2 the size of static foreach(at which point a new curve gets introduced) which swap being worse then ram skyrockets, then shortly after static foreach joins in.
--- ```d #!opend -unittest -main -run app.d bool isEvenImpl(int I)()=>! I%2; enum cases=10000; import std.range; bool isEven(int i){ switch(i){ static foreach(I;0..cases){ //foreach(I;enumlist!(iota(cases))){ case I: return isEvenImpl!I; } default: assert(0); }} template Val(int V){ enum Val=V; } alias seq(T...)=T; template enumlist(alias R){ alias enumlist=seq!(); static foreach(e;R){ enumlist=seq!(enumlist,Val!e); }} unittest{ import std; alias A=enumlist!(iota(5)); A.stringof.writeln; } unittest{ import std; 7.isEven.writeln; } ```
static foreach(I;0..cases){ //2.86s foreach(I;enumlist!(iota(cases))){ //7.30s
Not going to do more tests but I believe you should stick with static each when possible but im pretty sure they share bigO details