summaryrefslogtreecommitdiff
path: root/benchmarks
diff options
context:
space:
mode:
Diffstat (limited to 'benchmarks')
-rw-r--r--benchmarks/Makefile6
-rw-r--r--benchmarks/local-ping-pong.scm39
2 files changed, 44 insertions, 1 deletions
diff --git a/benchmarks/Makefile b/benchmarks/Makefile
index bb6065f..cc1c7fb 100644
--- a/benchmarks/Makefile
+++ b/benchmarks/Makefile
@@ -1,10 +1,11 @@
chain_csv:=chain-0.csv chain-10.csv chain-100.csv
ping_pong_csv:=ping-pong-10.csv ping-pong-100.csv
+local_ping_pong_csv:=local-ping-pong-10.csv local-ping-pong-100.csv
fan_out_csv:=fan-out-10.csv fan-out-100.csv
diagonal_csv:=diagonal-10.csv diagonal-100.csv
sieve_csv:=sieve-2000.csv
-csv:=$(chain_csv) $(ping_pong_csv) $(fan_out_csv) $(diagonal_csv) $(sieve_csv)
+csv:=$(chain_csv) $(ping_pong_csv) $(local_ping_pong_csv) $(fan_out_csv) $(diagonal_csv) $(sieve_csv)
all: $(csv)
@@ -14,6 +15,9 @@ chain-%.csv:
ping-pong-%.csv:
../env guile ./scale-bench guile ping-pong.scm $* '#e1e4' | tee $@
+local-ping-pong-%.csv:
+ ../env guile ./scale-bench guile local-ping-pong.scm $* '#e1e4' | tee $@
+
fan-out-%.csv:
../env guile ./scale-bench guile fan-out.scm $* '#e1e5' | tee $@
diff --git a/benchmarks/local-ping-pong.scm b/benchmarks/local-ping-pong.scm
new file mode 100644
index 0000000..400421b
--- /dev/null
+++ b/benchmarks/local-ping-pong.scm
@@ -0,0 +1,39 @@
+#!/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))))
+ (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)))