diff --git a/src/test/bench/shootout/pfib.rs b/src/test/bench/shootout/pfib.rs new file mode 100644 index 000000000000..60f2d3779c19 --- /dev/null +++ b/src/test/bench/shootout/pfib.rs @@ -0,0 +1,41 @@ +// -*- rust -*- + +/* + A parallel version of fibonacci numbers. +*/ + +fn recv[T](&port[T] p) -> T { + 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(); + + auto t1 = spawn pfib(chan(p), n - 1); + auto t2 = spawn pfib(chan(p), n - 2); + + c <| recv(p) + 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); +}