on master help sign in
Add ST reference to the countdown benchmark
commitb1d8d7a2c3ee805c0859254e2eceb012a660bb9d authorAndrzej Rybczak <andrzej@rybczak.net> dateMon 28 Jun 2021, 22:03 (5 years ago) parent8c57dc6
2 files changed+24−1
bench/Countdown.hs+22 bench/Main.hs+2−1
bench/Countdown.hs+22
@@ -1,7 +1,9 @@
11{-# LANGUAGE CPP #-}
22module Countdown where
33
4+import Control.Monad.ST
45import Data.Functor.Identity
6+import Data.STRef
57
68-- eff
79#ifdef VERSION_eff
@@ -47,6 +49,26 @@ countdownRef :: Integer -> (Integer, Integer)
4749countdownRef n = if n <= 0 then (n, n) else countdownRef $ n - 1
4850{-# NOINLINE countdownRef #-}
4951
52+----------------------------------------
53+-- ST
54+
55+programST :: STRef s Integer -> ST s Integer
56+programST ref = do
57+ n <- readSTRef ref
58+ if n <= 0
59+ then pure n
60+ else do
61+ writeSTRef ref $! n - 1
62+ programST ref
63+{-# NOINLINE programST #-}
64+
65+countdownST :: Integer -> (Integer, Integer)
66+countdownST n = runST $ do
67+ ref <- newSTRef n
68+ a <- programST ref
69+ s <- readSTRef ref
70+ pure (a, s)
71+
5072----------------------------------------
5173-- mtl
5274
bench/Main.hs+2−1
@@ -22,7 +22,8 @@ main = defaultMain
2222countdown :: Integer -> Benchmark
2323countdown n = bgroup (show n)
2424 [ bgroup "shallow"
25− [ bench "reference" $ nf countdownRef n
25+ [ bench "reference (pure)" $ nf countdownRef n
26+ , bench "reference (ST)" $ nf countdownST n
2627 , bench "effectful (pure-static)" $ nf countdownEffectfulStatic n
2728 , bench "effectful (pure-dynamic)" $ nf countdownEffectfulDynPure n
2829 , bench "effectful (MVar-static)" $ nf countdownEffectfulMVar n