about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEric Holk <eric.holk@gmail.com>2012-06-15 14:10:36 -0700
committerEric Holk <eric.holk@gmail.com>2012-06-21 16:11:11 -0700
commit40559ea83961df06c82f76c333ce4c9604f12449 (patch)
treeab367023fad94616c8d6d40126ef00b6d1e084a8
parentdc3862bf58297b75a0e3d4dfdf1f66b56f51dd1d (diff)
downloadrust-40559ea83961df06c82f76c333ce4c9604f12449.tar.gz
rust-40559ea83961df06c82f76c333ce4c9604f12449.zip
Adding a benchmark for the new message passing code
-rw-r--r--src/test/bench/msgsend-ring-new.rs76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/test/bench/msgsend-ring-new.rs b/src/test/bench/msgsend-ring-new.rs
new file mode 100644
index 00000000000..cba62f2ada1
--- /dev/null
+++ b/src/test/bench/msgsend-ring-new.rs
@@ -0,0 +1,76 @@
+// This test creates a bunch of tasks that simultaneously send to each
+// other in a ring. The messages should all be basically
+// independent. It's designed to hammer the global kernel lock, so
+// that things will look really good once we get that lock out of the
+// message path.
+
+import newcomm::*;
+import future::future;
+
+use std;
+import std::time;
+
+fn thread_ring(i: uint,
+               count: uint,
+               num_chan: chan<uint>,
+               num_port: port<uint>) {
+    // Send/Receive lots of messages.
+    for uint::range(0u, count) {|j|
+        num_chan.send(i * j);
+        num_port.recv();
+    };
+}
+
+fn main(args: [str]) {
+    let args = if os::getenv("RUST_BENCH").is_some() {
+        ["", "100", "10000"]
+    } else if args.len() <= 1u {
+        ["", "100", "1000"]
+    } else {
+        args
+    };        
+
+    let num_tasks = option::get(uint::from_str(args[1]));
+    let msg_per_task = option::get(uint::from_str(args[2]));
+
+    let num_port = port();
+    let mut num_chan = chan(num_port);
+
+    let start = time::precise_time_s();
+
+    // create the ring
+    let mut futures = [];
+
+    for uint::range(1u, num_tasks) {|i|
+        let get_chan = port();
+        let get_chan_chan = chan(get_chan);
+        {
+            let num_chan = num_chan.clone();
+            futures += [future::spawn {|move num_chan, move get_chan_chan|
+                let p = port();
+                get_chan_chan.send(chan(p));
+                thread_ring(i, msg_per_task, num_chan,  p)
+            }];
+        }
+        
+        num_chan = get_chan.recv();
+    };
+
+    // do our iteration
+    thread_ring(0u, msg_per_task, num_chan, num_port);
+
+    // synchronize
+    for futures.each {|f| f.get() };
+
+    let stop = time::precise_time_s();
+
+    // all done, report stats.
+    let num_msgs = num_tasks * msg_per_task;
+    let elapsed = (stop - start);
+    let rate = (num_msgs as float) / elapsed;
+
+    io::println(#fmt("Sent %? messages in %? seconds",
+                     num_msgs, elapsed));
+    io::println(#fmt("  %? messages / second", rate));
+    io::println(#fmt("  %? μs / message", 1000000. / rate));
+}