bearophile wrote:
To test the new scoping features of D 2.021 I have used a small stressing
program, coming from this page, originally by Knuth:
http://www.rosettacode.org/wiki/Man_or_boy_test
More info:
http://en.wikipedia.org/wiki/Man_or_boy_test
My purpose is to see the D2 compiler being able to compute results up to N=25
on my PC (that has 2 GB RAM and a 32 bit operating system).
---------------------------
This is the code I have used for DMD 1.037:
import std.c.stdio: printf;
int a(int k, lazy int x1, lazy int x2, lazy int x3, lazy int x4, lazy int x5) {
int delegate() b;
b = {
k -= 1;
return a(k, b(), x1, x2, x3, x4);
};
return k <= 0 ? x4 + x5 : b();
}
void main() {
printf("%d\n", a(15, 1, -1, -1, 1, 0)); // N is 15
}
---------------------------
This is the code I have used for DMD 2.021. I was not sure how to use the
scope, so if you have improvements please tell me:
import std.c.stdio: printf;
int a(scope int k, lazy int x1, lazy int x2, lazy int x3, lazy int x4, lazy int
x5) {
scope int delegate() b;
b = {
k -= 1;
return a(k, b(), x1, x2, x3, x4);
};
return k <= 0 ? x4 + x5 : b();
}
void main() {
printf("%d\n", a(15, 1, -1, -1, 1, 0)); // N is 15
}
---------------------------
The results for higher values of N are:
k 21 22 23 24 25
A -389695 -865609 -1922362 -4268854 -9479595
In both cases I have compiled the code with:
dmd -O -release -inline -L/STACK:1700000000 man_or_boy.d
The results:
DMD V.1.037 (exe: 168_476: bytes):
N=24: 788 MB RAM, 3 seconds
N=25: 1.57 GB RAM, 6.42 seconds
DMD V.2.021 (exe: 99_356 bytes):
The code was too much slow in D2, so I have stopped it. Do you know if the D2
code can be improved to have performance similar to D1 ones?
Bye,
bearophile
Try marking all the "lazy" parameters as "scope" ("lazy" creates delegates).