From d8aa60558b00da29c448a487ed787e29a6aca580 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Wed, 25 Sep 2024 21:31:28 -0400 Subject: [PATCH] benchmark for a concurrent, channel-based, Erathostene prime sieve --- benchs/dune | 2 +- benchs/primes.ml | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 benchs/primes.ml diff --git a/benchs/dune b/benchs/dune index 14393230..6d2ec5ff 100644 --- a/benchs/dune +++ b/benchs/dune @@ -1,5 +1,5 @@ (executables - (names fib_rec pi) + (names fib_rec pi primes) (preprocess (action (run %{project_root}/src/cpp/cpp.exe %{input-file}))) diff --git a/benchs/primes.ml b/benchs/primes.ml new file mode 100644 index 00000000..570b850f --- /dev/null +++ b/benchs/primes.ml @@ -0,0 +1,32 @@ +let ( let@ ) = ( @@ ) + +let generate' chan = + for i = 2 to Int.max_int do + Moonpool.Chan.push chan i; + Thread.yield () + done + +let filter' in_chan out_chan prime = + let rec loop () = + let n = Moonpool.Chan.pop_await in_chan in + if n mod prime <> 0 then Moonpool.Chan.push out_chan n; + loop () + in + loop () + +let () = + let@ runner = Moonpool.Ws_pool.with_ () in + let@ () = Moonpool.Ws_pool.run_wait_block runner in + let primes = ref @@ Moonpool.Chan.create () in + Moonpool.run_async runner + (let chan = !primes in + fun () -> generate' chan); + for _i = 1 to 10 do + let prime = Moonpool.Chan.pop_await !primes in + Format.printf "%d\n@?" prime; + let filtered_chan = Moonpool.Chan.create () in + Moonpool.run_async runner + (let in_chan = !primes in + fun () -> filter' in_chan filtered_chan prime); + primes := filtered_chan + done