summary refs log tree commit diff
path: root/src/test/bench
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-12-17 16:45:13 -0800
committerBrian Anderson <banderson@mozilla.com>2011-12-20 20:15:09 -0800
commitaeadc6269ef76f4425a49d892ceac7ea311ef5c1 (patch)
treee62356f817552b6430f43b6c72964325791418d1 /src/test/bench
parent128621be97d425a1d19e6640c8aee4fb6fca430b (diff)
downloadrust-aeadc6269ef76f4425a49d892ceac7ea311ef5c1.tar.gz
rust-aeadc6269ef76f4425a49d892ceac7ea311ef5c1.zip
wip
Diffstat (limited to 'src/test/bench')
-rw-r--r--src/test/bench/task-perf-one-million.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/test/bench/task-perf-one-million.rs b/src/test/bench/task-perf-one-million.rs
new file mode 100644
index 00000000000..8430351b7e9
--- /dev/null
+++ b/src/test/bench/task-perf-one-million.rs
@@ -0,0 +1,60 @@
+// xfail-test FIXME: Can't run under valgrind - too much RAM
+// FIXME: This doesn't spawn close to a million tasks yet
+
+tag msg {
+    ready(comm::chan<msg>);
+    start;
+    done(int);
+}
+
+fn calc(&&args: (int, comm::chan<msg>)) {
+    let (depth, parent_ch) = args;
+    let port = comm::port();
+    let children = depth > 0 ? 20u : 0u;
+    let child_chs = [];
+    let sum = 0;
+
+    repeat (children) {||
+        task::spawn((depth - 1, comm::chan(port)), calc);
+    }
+
+    repeat (children) {||
+        alt comm::recv(port) {
+          ready(child_ch) {
+            child_chs += [child_ch];
+          }
+        }
+    }
+
+    comm::send(parent_ch, ready(comm::chan(port)));
+
+    alt comm::recv(port) {
+        start. {
+          vec::iter (child_chs) { |child_ch|
+              comm::send(child_ch, start);
+          }
+        }
+    }
+
+    repeat (children) {||
+        alt comm::recv(port) {
+          done(child_sum) { sum += child_sum; }
+        }
+    }
+
+    comm::send(parent_ch, done(sum + 1));
+}
+
+fn main() {
+    let port = comm::port();
+    task::spawn((3, comm::chan(port)), calc);
+    alt comm::recv(port) {
+      ready(chan) {
+        comm::send(chan, start);
+      }
+    }
+    let sum = alt comm::recv(port) {
+      done(sum) { sum }
+    };
+    log #fmt("How many tasks? That's right, %d tasks.", sum);
+}
\ No newline at end of file