Tuesday, April 1, 2008

GC Benchmark

Some time ago, there was a GC benchmark done among the programming languages. I did then, Tango version of D candidate for this test. I was asked to check if the benchmark is still up to date. It was. Since I haven't write about it here, I will do now.

Code is simple, and created only for GC examination. Test was made with dmd 1.028, Tango trunk version (revision 3410) and Phobos that comes with 1.028 on my personal IBM T41 laptop. Both compiled with:

build -release -inline -cleanup -O

Tango result:
real 0m14.091s user 0m0.010s sys 0m0.020s
real 0m14.000s user 0m0.020s sys 0m0.000s
real 0m14.180s user 0m0.020s sys 0m0.000s
real 0m13.389s user 0m0.010s sys 0m0.010s
real 0m13.410s user 0m0.020s sys 0m0.030s
avg: 13.814

Phobos results:
real 0m19.058s user 0m0.010s sys 0m0.010s
real 0m20.649s user 0m0.020s sys 0m0.000s
real 0m19.378s user 0m0.010s sys 0m0.010s
real 0m18.617s user 0m0.010s sys 0m0.010s
real 0m18.626s user 0m0.020s sys 0m0.000s
avg: 19.266

As you see GC is much faster in Tango than in Phobos.

Code:
class TreeNode {
int item;
TreeNode left, right;

this(int item, TreeNode left=null, TreeNode right=null) {
this.item = item;
this.left = left;
this.right = right;
}

int check() {
return left is null ? item : item + left.check - right.check;
}
}

TreeNode makeTree(int item, int depth) {
if (depth > 0){
return new TreeNode(item, makeTree(2*item-1, depth-1), makeTree(2*item, depth-1));
} else {
return new TreeNode(item);
}
}

void main(char[][] args) {
const minDepth = 4;
int n = 16;
int maxDepth = (minDepth + 2) > n ? minDepth + 2 : n;

int check = makeTree(0, maxDepth + 1).check;

auto longLivedTree = makeTree(0, maxDepth);

for (int depth = minDepth; depth <= maxDepth; depth += 2){ int iterations = 1 << (maxDepth - depth + minDepth); check = 0; for (int i = 1; i <= iterations; i++) check += (makeTree(i, depth)).check + (makeTree(-i, depth)).check; } }