add TBQueue to the benchmark, and add a Makefile driver
authorSimon Marlow <marlowsd@gmail.com>
Wed, 4 Jul 2012 10:20:45 +0000 (11:20 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Wed, 4 Jul 2012 10:20:45 +0000 (11:20 +0100)
bench/Makefile [new file with mode: 0644]
bench/chanbench.hs

diff --git a/bench/Makefile b/bench/Makefile
new file mode 100644 (file)
index 0000000..17b4884
--- /dev/null
@@ -0,0 +1,4 @@
+# Run chanbench for 4 different channel types, 3 different benchmarks
+all:
+       for i in CHAN TCHAN TQUEUE TBQUEUE; do ghc -D$$i -O2 chanbench.hs -o chanbench-$$i; done
+       for i in 0 1 2; do echo; echo === test $$i ===; for j in CHAN TCHAN TQUEUE TBQUEUE; do printf "%-10s" $$j; time ./chanbench-$$j $$i 2000000; done; done
index 05ab909..8c534f1 100644 (file)
@@ -6,13 +6,15 @@ import System.Environment
 import Control.Concurrent.Chan
 import Control.Concurrent.STM
 import Control.Concurrent.STM.TQueue
+import Control.Concurrent.STM.TBQueue
 
 -- Using CPP rather than a runtime choice between channel types,
 -- because we want the compiler to be able to optimise the calls.
 
-#define CHAN
+-- #define CHAN
 -- #define TCHAN
 -- #define TQUEUE
+-- #define TBQUEUE
 
 #ifdef CHAN
 newc = newChan
@@ -26,6 +28,10 @@ writec c x = atomically $ writeTChan c x
 newc = newTQueueIO
 readc c = atomically $ readTQueue c
 writec c x = atomically $ writeTQueue c x
+#elif defined(TBQUEUE)
+newc = newTBQueueIO 4096
+readc c = atomically $ readTBQueue c
+writec c x = atomically $ writeTBQueue c x
 #endif
 
 main = do
@@ -47,7 +53,7 @@ runtest n test = do
       replicateM_ n $ writec c (1 :: Int)
       replicateM_ n $ readc c
     2 -> do
-      let n10 = n `quot` 10
-      replicateM_ 10 $ do
-        replicateM_ n10 $ writec c (1 :: Int)
-        replicateM_ n10 $ readc c
+      let n1000 = n `quot` 1000
+      replicateM_ 1000 $ do
+        replicateM_ n1000 $ writec c (1 :: Int)
+        replicateM_ n1000 $ readc c