summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2017-06-16 14:20:28 +0200
committerAndy Wingo <wingo@pobox.com>2017-06-16 14:20:28 +0200
commit6e7765744058756bdb3e0d45edf57491bb80f488 (patch)
tree0e30a29960401e148f65037aca9d514e7bc760ad
parentAdd benchmarks. (diff)
downloadguile-fibers-6e7765744058756bdb3e0d45edf57491bb80f488.tar.gz
Add false sieve-of-erastothenes benchmark
-rw-r--r--benchmarks/sieve.scm51
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)))