From 0438e6e924f09453dceff010bb4264568afa35a0 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 15 Feb 2012 11:52:43 -0800 Subject: [PATCH] bench: Add a test for task concurrency --- src/test/bench/task-perf-one-million.rs | 68 +++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/test/bench/task-perf-one-million.rs 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..98eefbaf06f --- /dev/null +++ b/src/test/bench/task-perf-one-million.rs @@ -0,0 +1,68 @@ +// Test for concurrent tasks + +enum msg { + ready(comm::chan), + start, + done(int), +} + +fn calc(children: uint, parent_ch: comm::chan) { + let port = comm::port(); + let chan = comm::chan(port); + let child_chs = []; + let sum = 0; + + iter::repeat (children) {|| + task::spawn {|| + calc(0u, chan); + }; + } + + iter::repeat (children) {|| + alt check comm::recv(port) { + ready(child_ch) { + child_chs += [child_ch]; + } + } + } + + comm::send(parent_ch, ready(chan)); + + alt check comm::recv(port) { + start { + vec::iter (child_chs) { |child_ch| + comm::send(child_ch, start); + } + } + } + + iter::repeat (children) {|| + alt check comm::recv(port) { + done(child_sum) { sum += child_sum; } + } + } + + comm::send(parent_ch, done(sum + 1)); +} + +fn main(args: [str]) { + let children = if vec::len(args) == 2u { + uint::from_str(args[1]) + } else { + 100u + }; + let port = comm::port(); + let chan = comm::chan(port); + task::spawn {|| + calc(children, chan); + }; + alt check comm::recv(port) { + ready(chan) { + comm::send(chan, start); + } + } + let sum = alt check comm::recv(port) { + done(sum) { sum } + }; + #error("How many tasks? %d tasks.", sum); +} \ No newline at end of file