summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2017-06-16 14:41:37 +0200
committerAndy Wingo <wingo@pobox.com>2017-06-16 14:41:37 +0200
commitca4469c6ceeae8be86a44fc5b3d51632406fe622 (patch)
tree1b37e42a2f9963eb82849e1809438caac0f311d9
parentRemove sieve printout (diff)
downloadguile-fibers-ca4469c6ceeae8be86a44fc5b3d51632406fe622.tar.gz
Add parallel ping-pong benchmark
-rw-r--r--benchmarks/ping-pong.scm40
1 files changed, 40 insertions, 0 deletions
diff --git a/benchmarks/ping-pong.scm b/benchmarks/ping-pong.scm
new file mode 100644
index 0000000..995ecd7
--- /dev/null
+++ b/benchmarks/ping-pong.scm
@@ -0,0 +1,40 @@
+#!/usr/bin/env guile
+# -*- scheme -*-
+!#
+
+(use-modules (ice-9 match)
+ (fibers)
+ (fibers channels))
+
+(define (run-ping-pong message-count)
+ (let ((ch (make-channel)))
+ (spawn-fiber (lambda ()
+ (let lp ()
+ (put-message ch (get-message ch))
+ (lp)))
+ #:parallel? #t)
+ (let lp ((n 0))
+ (when (< n message-count)
+ (put-message ch n)
+ (get-message ch)
+ (lp (1+ n))))))
+
+(define (test pair-count message-count)
+ (let ((done (make-channel)))
+ (for-each (lambda (_)
+ (spawn-fiber (lambda ()
+ (run-ping-pong message-count)
+ (put-message done 'done))
+ #:parallel? #t))
+ (iota pair-count))
+ (for-each (lambda (_) (get-message done))
+ (iota pair-count))))
+
+(define (main args)
+ (match args
+ ((_ pair-count message-count)
+ (let ((pair-count (string->number pair-count))
+ (message-count (string->number message-count)))
+ (run-fibers (lambda () (test pair-count message-count)))))))
+
+(when (batch-mode?) (main (program-arguments)))