add two mutable store benchmarks
authorSimon Marlow <marlowsd@gmail.com>
Thu, 14 Oct 2010 12:11:39 +0000 (12:11 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Thu, 14 Oct 2010 12:11:39 +0000 (12:11 +0000)
gc/Makefile
gc/mutstore1/Main.hs [new file with mode: 0644]
gc/mutstore1/Makefile [new file with mode: 0644]
gc/mutstore1/Store1.hs [new file with mode: 0644]
gc/mutstore2/Main.hs [new file with mode: 0644]
gc/mutstore2/Makefile [new file with mode: 0644]
gc/mutstore2/Store2.hs [new file with mode: 0644]

index 650bd1e..a778e61 100644 (file)
@@ -2,6 +2,7 @@ TOP = ..
 include $(TOP)/mk/boilerplate.mk
 
 SUBDIRS= circsim constraints fibheaps fulsom gc_bench happy lcss power spellcheck
+        mutstore1 mutstore2
 # Bitrotted: ghc
 
 # Discount treejoin: runs too quickly to see any speedup beyond a few procs
diff --git a/gc/mutstore1/Main.hs b/gc/mutstore1/Main.hs
new file mode 100644 (file)
index 0000000..b34fa23
--- /dev/null
@@ -0,0 +1,16 @@
+-- test performance of a mutable store represented as an Array of IORefs.
+
+module Main where
+import Store1
+--import Store2
+import Control.Monad
+import System.Environment
+
+main = 
+  do [n] <- fmap (fmap read) getArgs
+     ss <- replicateM n mkStore
+     replicateM_ 5 (mapM_ testSequence ss)
+
+testSequence :: Store -> IO ()
+testSequence s = 
+  do replicateM_ 5 (addElemToBucket s 3 17)
diff --git a/gc/mutstore1/Makefile b/gc/mutstore1/Makefile
new file mode 100644 (file)
index 0000000..85cf4f9
--- /dev/null
@@ -0,0 +1,8 @@
+TOP = ../..
+include $(TOP)/mk/boilerplate.mk
+
+FAST_OPTS = 100000
+NORM_OPTS = 300000
+SLOW_OPTS = 600000
+
+include $(TOP)/mk/target.mk
diff --git a/gc/mutstore1/Store1.hs b/gc/mutstore1/Store1.hs
new file mode 100644 (file)
index 0000000..12b13fd
--- /dev/null
@@ -0,0 +1,18 @@
+--Immutable array with IORefs to lists
+
+module Store1 where
+import Data.IORef
+import Data.Array
+
+type Store = Array Int (IORef [Int])
+
+mkStore :: IO Store
+mkStore =
+  do buckets <- sequence ( take 10 $ repeat (newIORef []) )
+     let myArray = listArray (0, 9) buckets
+     return $! myArray
+
+addElemToBucket :: Store -> Int -> Int -> IO ()
+addElemToBucket a k e =
+  do buc <- readIORef (a!k)
+     writeIORef (a!k) (e : buc)
diff --git a/gc/mutstore2/Main.hs b/gc/mutstore2/Main.hs
new file mode 100644 (file)
index 0000000..0aed895
--- /dev/null
@@ -0,0 +1,16 @@
+-- test performance of a mutable store represented as an IOArray of lists.
+
+module Main where
+--import Store1
+import Store2
+import Control.Monad
+import System.Environment
+
+main = 
+  do [n] <- fmap (fmap read) getArgs
+     ss <- replicateM n mkStore
+     replicateM_ 5 (mapM_ testSequence ss)
+
+testSequence :: Store -> IO ()
+testSequence s = 
+  do replicateM_ 5 (addElemToBucket s 3 17)
diff --git a/gc/mutstore2/Makefile b/gc/mutstore2/Makefile
new file mode 100644 (file)
index 0000000..85cf4f9
--- /dev/null
@@ -0,0 +1,8 @@
+TOP = ../..
+include $(TOP)/mk/boilerplate.mk
+
+FAST_OPTS = 100000
+NORM_OPTS = 300000
+SLOW_OPTS = 600000
+
+include $(TOP)/mk/target.mk
diff --git a/gc/mutstore2/Store2.hs b/gc/mutstore2/Store2.hs
new file mode 100644 (file)
index 0000000..b17c292
--- /dev/null
@@ -0,0 +1,15 @@
+--IOArray with lists
+
+module Store2 where
+import Data.IORef
+import Data.Array.IO
+
+type Store = IOArray Int [Int]
+
+mkStore :: IO Store
+mkStore = newArray (0, 9) []
+
+addElemToBucket :: Store -> Int -> Int -> IO ()
+addElemToBucket a k e =
+  do buc <- readArray a k
+     writeArray a k (e : buc)