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
