about summary refs log tree commit diff
path: root/src/test/bench
diff options
context:
space:
mode:
authorBrian Anderson <andersrb@gmail.com>2011-03-13 18:43:39 -0400
committerGraydon Hoare <graydon@mozilla.com>2011-03-14 15:52:48 -0700
commit467b9f3908dc74976807ddad4138f3d496433234 (patch)
tree7b27f371d90c37a1c28133c53bd91db248ffca5e /src/test/bench
parent922f69387dab9f751ab110055d5b9638dbae6a78 (diff)
Implement the rest of the binary trees shootout benchmark
Diffstat (limited to 'src/test/bench')
-rw-r--r--src/test/bench/shootout/binary-trees.rs56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/test/bench/shootout/binary-trees.rs b/src/test/bench/shootout/binary-trees.rs
index 5f87943484f..92bedb8b9e6 100644
--- a/src/test/bench/shootout/binary-trees.rs
+++ b/src/test/bench/shootout/binary-trees.rs
@@ -1,3 +1,7 @@
+use std;
+
+import std._int;
+
 tag tree {
   nil;
   node(@tree, @tree, int);
@@ -14,5 +18,57 @@ fn item_check(@tree t) -> int {
   }
 }
 
+fn bottom_up_tree(int item, int depth) -> @tree{
+  if (depth > 0) {
+    ret @node(bottom_up_tree(2 * item - 1, depth - 1),
+              bottom_up_tree(2 * item, depth - 1),
+              item);
+  } else {
+    ret @nil;
+  }
+}
+
 fn main() {
+
+  auto n = 8;
+  auto min_depth = 4;
+  auto max_depth;
+  if (min_depth + 2 > n) {
+    max_depth = min_depth + 2;
+  } else {
+    max_depth = n;
+  }
+
+  auto stretch_depth = max_depth + 1;
+
+  auto stretch_tree = bottom_up_tree(0, stretch_depth);
+  log #fmt("stretch tree of depth %d\t check: %d",
+           stretch_depth, item_check(stretch_tree));
+
+  auto long_lived_tree = bottom_up_tree(0, max_depth);
+
+  auto depth = min_depth;
+  while (depth <= max_depth) {
+    auto iterations = _int.pow(2, (max_depth - depth + min_depth) as uint);
+    auto chk = 0;
+
+    auto i = 1;
+    while (i <= iterations) {
+      auto temp_tree = bottom_up_tree(i, depth);
+      chk += item_check(temp_tree);
+
+      temp_tree = bottom_up_tree(-i, depth);
+      chk += item_check(temp_tree);
+
+      i += 1;
+    }
+
+    log #fmt("%d\t trees of depth %d\t check: %d",
+             iterations * 2, depth, chk);
+
+    depth += 2;
+  }
+
+  log #fmt("long lived trees of depth %d\t check: %d",
+           max_depth, item_check(long_lived_tree));
 }
\ No newline at end of file