diff options
| author | Eric Holk <eholk@mozilla.com> | 2011-06-28 17:58:44 -0700 |
|---|---|---|
| committer | Eric Holk <eholk@mozilla.com> | 2011-06-30 11:32:10 -0700 |
| commit | b4a145e60f4bbc90dc780239cc49c024b9f52ca8 (patch) | |
| tree | 020734b92aa7fea2269b3915d45d1d9730c4192c /src/test/bench | |
| parent | 441c7e06109772f7ff942682fb6d0a7535f03666 (diff) | |
| download | rust-b4a145e60f4bbc90dc780239cc49c024b9f52ca8.tar.gz rust-b4a145e60f4bbc90dc780239cc49c024b9f52ca8.zip | |
Added a nanosecond timer to time.rs, support for some floating point casts, and a commandline-driven mode for pfib.rs
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); + } } |
