binary-tree bentchmark
Nemerleに移植してみました。
結果は、
[Nemerle+Mono1.1.14] real 0m1.454s user 0m0.015s sys 0m0.015s [Nemerle+.NET2.0 real 0m0.859s user 0m0.015s sys 0m0.016s
静的な型だと流石に速いです。実はコードが間違っているというオチはないですよね?(^^;
Nemerleのコードは以下の通り。
using System; using Nemerle.IO; variant Tree { | Node { left : Tree; item : int; right: Tree; } | Empty } def make (i, d) { | (_, 0) => Tree.Empty() | _ => def i2 = 2 * i; def d2 = d - 1; Tree.Node(make(i2 - 1, d2), i, make (i2, d2)); } def check(_) { | Tree.Empty => 0 | Tree.Node(l, i, r) => i + check(l) - check(r) } def argv = Environment.GetCommandLineArgs(); def min_depth = 4; def max_depth = Math.Max(min_depth + 2, int.Parse(argv[1])); def stretch_depth = max_depth + 1; printf("stretch tree of depth %d\t check: %d\n", stretch_depth, check(make(0, stretch_depth))); def long_lived_tree = make(0, max_depth); foreach (depth in $[min_depth, min_depth+2 .. stretch_depth-1]) { def iterations = 1 << (max_depth - depth + min_depth); mutable c = 0; foreach (i in $[1 .. iterations]) c += check(make(i, depth)) + check(make(-i, depth)); printf("%d\t trees of depth %d\t check: %d\n", iterations * 2, depth, c); } printf("long lived tree of depth %d\t check: %d\n", max_depth, check(long_lived_tree));
C#そっくりに書くことも出来ますが、ちょっとだけ関数型っぽいところを出してみました。