[Issue 5276] Template compilation uses much more memory than G++ 4.8

2017-07-07 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=5276

Vladimir Panteleev  changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution|--- |WORKSFORME

--- Comment #5 from Vladimir Panteleev  ---
Fixed by https://github.com/dlang/dmd/pull/2239 - compilation is under one
second now.

--


[Issue 5276] Template compilation uses much more memory than G++ 4.8

2017-07-07 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=5276

Vladimir Panteleev  changed:

   What|Removed |Added

   Hardware|x86 |All
 OS|Windows |All

--


[Issue 5276] Template compilation uses much more memory than G++ 4.8

2014-07-04 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=5276

bearophile_h...@eml.cc changed:

   What|Removed |Added

Summary|Template compilation slower |Template compilation uses
   |than G++ 4.5|much more memory than G++
   ||4.8

--


[Issue 5276] Template compilation uses much more memory than G++ 4.8

2014-07-04 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=5276

--- Comment #4 from bearophile_h...@eml.cc ---
Updated D code, a little slower (?) but also nicer:



template State(ulong Cols=0, ulong Diag135=0, ulong Diag45=0, ulong Solution=0)
{
enum ulong cols = Cols;
enum ulong diag135 = Diag135;
enum ulong diag45 = Diag45;
enum ulong solution = Solution;
}

enum Test(int k, int j, alias state) =
((state.cols (1UL  j)) +
 (state.diag135  (1UL  (j + k))) +
 (state.diag45   (1UL  (32 + j - k == 0;

alias Mark(int k, int j, alias state) =
State!(state.cols^ (1UL  j),
   state.diag135 ^ (1UL  (j + k)),
   state.diag45  ^ (1UL  (32 + j - k)),
   state.solution);

template AccumulateResult(int startValue, int times, alias state) {
static if (times == 0)
alias AccumulateResult = state;
else
alias AccumulateResult = AccumulateResult!(
startValue + 1,
times - 1,
State!(state.cols,
   state.diag135,
   state.diag45,
   state.solution + Test!(0, startValue, state)));
}

template ResultFromTest(bool condition, alias state, int current, int niv, int
dx) {
static if (condition == 0)
alias ResultFromTest = state;
else
alias ResultFromTest = Mark!(niv,
 current,
 Solve!(niv - 1, dx, Mark!(niv, current,
state)));
}

template ProcessQueens(int begin, int times, alias state, int niv, int dx) {
static if (times == 0)
alias ProcessQueens = state;
else
alias ProcessQueens = ProcessQueens!(
begin + 1,
times - 1,
ResultFromTest!(Test!(niv, begin, state), state, begin, niv,
dx),
niv,
dx);
}

template Solve(int niv, int dx, alias state=State!()) {
static if (niv == 0)
alias Solve = AccumulateResult!(0, dx, state);
else
alias Solve = ProcessQueens!(0, dx, state, niv, dx);
}

enum MetaNQueens(int dx) = Solve!(dx - 1, dx).solution;

void main() {
import core.stdc.stdio: printf;

printf(%llu, MetaNQueens!7);
}

--