diff options
Diffstat (limited to 'src/test/bench')
| -rw-r--r-- | src/test/bench/shootout/pfib.rs | 71 |
1 files changed, 47 insertions, 24 deletions
diff --git a/src/test/bench/shootout/pfib.rs b/src/test/bench/shootout/pfib.rs index f7fda8b8110..cbe0813efc4 100644 --- a/src/test/bench/shootout/pfib.rs +++ b/src/test/bench/shootout/pfib.rs @@ -4,38 +4,61 @@ A parallel version of fibonacci numbers. */ +use std; + +import std::vec; +import std::uint; +import std::time; +import std::str; + fn recv[T](&port[T] p) -> T { - let T x; - p |> x; - ret x; + let T x; + p |> x; + ret x; } fn fib(int n) -> int { - fn pfib(chan[int] c, int n) { - if (n == 0) { - c <| 0; - } - else if (n <= 2) { - c <| 1; - } - else { - let port[int] p = port(); + fn pfib(chan[int] c, int n) { + if (n == 0) { + c <| 0; + } + else if (n <= 2) { + c <| 1; + } + else { + let port[int] p = port(); - auto t1 = spawn pfib(chan(p), n - 1); - auto t2 = spawn pfib(chan(p), n - 2); + auto t1 = spawn pfib(chan(p), n - 1); + auto t2 = spawn pfib(chan(p), n - 2); - c <| recv(p) + recv(p); + c <| recv(p) + recv(p); + } } - } - let port[int] p = port(); - auto t = spawn pfib(chan(p), n); - ret recv(p); + let port[int] p = port(); + auto t = spawn pfib(chan(p), n); + ret recv(p); } -fn main() { - assert (fib(8) == 21); - assert (fib(15) == 610); - log fib(8); - log fib(15); +fn main(vec[str] argv) { + if(vec::len(argv) == 1u) { + assert (fib(8) == 21); + assert (fib(15) == 610); + log fib(8); + log fib(15); + } + else { + // Interactive mode! Wooo!!!! + + auto n = uint::parse_buf(str::bytes(argv.(1)), 10u) as int; + auto start = time::precise_time_ns(); + auto fibn = fib(n); + auto stop = time::precise_time_ns(); + + auto elapsed = (stop - start) as int; + auto us_task = elapsed / fibn / 1000; + + log_err #fmt("Determined that fib(%d) = %d in %d ns (%d us / task)", + n, fibn, elapsed, us_task); + } } |
