diff options
| author | Andy Wingo <wingo@pobox.com> | 2017-06-16 14:20:28 +0200 |
|---|---|---|
| committer | Andy Wingo <wingo@pobox.com> | 2017-06-16 14:20:28 +0200 |
| commit | 6e7765744058756bdb3e0d45edf57491bb80f488 (patch) | |
| tree | 0e30a29960401e148f65037aca9d514e7bc760ad | |
| parent | Add benchmarks. (diff) | |
| download | guile-fibers-6e7765744058756bdb3e0d45edf57491bb80f488.tar.gz | |
Add false sieve-of-erastothenes benchmark
| -rw-r--r-- | benchmarks/sieve.scm | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/benchmarks/sieve.scm b/benchmarks/sieve.scm new file mode 100644 index 0000000..85a8ede --- /dev/null +++ b/benchmarks/sieve.scm @@ -0,0 +1,51 @@ +#!/usr/bin/env guile +# -*- scheme -*- +!# + +(use-modules (ice-9 match) + (fibers) + (fibers channels)) + +(define (sieve p in) + (let ((out (make-channel))) + (spawn-fiber (lambda () + (let lp () + (let ((n (get-message in))) + (unless (zero? (modulo n p)) + (put-message out n))) + (lp))) + #:parallel? #t) + out)) + +(define (integers-from n) + (let ((out (make-channel))) + (spawn-fiber (lambda () + (let lp ((n n)) + (put-message out n) + (lp (1+ n)))) + #:parallel? #t) + out)) + +(define (take ch n) + (let lp ((n n)) + (unless (zero? n) + (get-message ch) + (lp (1- n))))) + +(define (primes) + (let ((out (make-channel))) + (spawn-fiber (lambda () + (let lp ((ch (integers-from 2))) + (let ((p (get-message ch))) + (put-message out p) + (lp (sieve 2 ch))))) + #:parallel? #t) + out)) + +(define (main args) + (match args + ((_ count) + (let ((count (string->number count))) + (run-fibers (lambda () (take (primes) count))))))) + +(when (batch-mode?) (main (program-arguments))) |
