diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-02-04 18:00:59 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-02-04 18:00:59 -0800 |
| commit | cdb246f832a8dcecbd5305a4c256c04e1e266a0a (patch) | |
| tree | 9a5361efa0d9a543584fb559aed6784dfee05cca | |
| parent | e81840607266d8c9af6ac5ddf187174c4689e26b (diff) | |
| download | rust-cdb246f832a8dcecbd5305a4c256c04e1e266a0a.tar.gz rust-cdb246f832a8dcecbd5305a4c256c04e1e266a0a.zip | |
bench: Add threadring shootout benchmark
| -rw-r--r-- | src/test/bench/shootout-threadring.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/test/bench/shootout-threadring.rs b/src/test/bench/shootout-threadring.rs new file mode 100644 index 00000000000..73f993f2728 --- /dev/null +++ b/src/test/bench/shootout-threadring.rs @@ -0,0 +1,53 @@ +// Based on threadring.erlang by Jira Isa +use std; + +// FIXME: Need a cleaner way to request the runtime to exit +#[nolink] +native mod libc { + fn exit(status: ctypes::c_int); +} + +const n_threads: int = 503; + +fn start(+token: int) { + import iter::*; + + let p = comm::port(); + let ch = iter::foldl(bind int::range(2, n_threads + 1, _), + comm::chan(p)) { |ch, i| + // FIXME: Some twiddling because we don't have a standard + // reverse range function yet + let id = n_threads + 2 - i; + let {to_child, _} = task::spawn_connected::<int, int> {|p, _ch| + roundtrip(id, p, ch) + }; + to_child + }; + comm::send(ch, token); + roundtrip(1, p, ch); +} + +fn roundtrip(id: int, p: comm::port<int>, ch: comm::chan<int>) { + while (true) { + alt comm::recv(p) { + 1 { + std::io::println(#fmt("%d\n", id)); + libc::exit(0i32); + } + token { + #debug("%d %d", id, token); + comm::send(ch, token - 1); + } + } + } +} + +fn main(args: [str]) { + let token = if vec::len(args) < 2u { + 1000 + } else { + int::from_str(args[1]) + }; + + start(token); +} \ No newline at end of file |
