@@ -1,51 +1,34 @@
1−{-# LANGUAGE RecordWildCards #-}
2module Main where
1module Main where
4−import Criterion.Main (defaultMain, bgroup, bench, nfIO)
3+import Control.Applicative (Alternative(..))
5import Control.Exception (assert)
4import Control.Exception (assert)
6−import Control.Monad.IO.Class (MonadIO (liftIO))
8−-- import Fusion as F hiding ((&))
9−import Data.Function ((&))
11−import qualified Data.Conduit as C
12−import qualified Data.Conduit.Combinators as C
13−import qualified Pipes as P
14−import qualified Pipes.Prelude as P
15−import qualified Streaming.Prelude as Str
16−import qualified System.IO.Streams as IOS
17−import qualified Conduit.Simple as S
20import Control.Monad (guard)
5import Control.Monad (guard)
21−import Control.Applicative (Alternative(..))
6+import Control.Monad.IO.Class (MonadIO (liftIO))
22−import Data.IORef (IORef, newIORef, writeIORef)
7+import Criterion.Main (defaultMain, bgroup, bench, nfIO)
23import Data.Atomics (atomicModifyIORefCAS)
8import Data.Atomics (atomicModifyIORefCAS)
9+import Data.IORef (IORef, newIORef, writeIORef)
24import System.IO.Unsafe (unsafePerformIO)
10import System.IO.Unsafe (unsafePerformIO)
25−import qualified Transient.Internals as T
26−import qualified Transient.Indeterminism as T
12+import qualified Asyncly as A
13+import qualified Control.Monad.Logic as LG
28import qualified Data.Machine as M
14import qualified Data.Machine as M
15+import qualified Transient.Internals as T
16+import qualified Transient.Indeterminism as T
29import qualified ListT as LT
17import qualified ListT as LT
30−import qualified Control.Monad.Logic as LG
31−import qualified Asyncly as A
33main :: IO ()
19main :: IO ()
35 defaultMain [
21 defaultMain [
23+ [ bench "asyncly (<>)" $ nfIO (asyncly_basic (A.<>))
24+ , bench "asyncly (<=>)" $ nfIO (asyncly_basic (A.<=>))
25+ , bench "asyncly (<|)" $ nfIO (asyncly_basic (A.<|))
36− bgroup "basic" [ bench "asyncly" $ nfIO asyncly_basic
26+ , bench "asyncly (<|>)" $ nfIO (asyncly_basic (A.<|>))
27+ , bench "transient" $ nfIO transient_basic
37− , bench "logict" $ nfIO logict_basic
28+ , bench "logict" $ nfIO logict_basic
38− , bench "list-t" $ nfIO list_t_basic
29+ , bench "list-t" $ nfIO list_t_basic
39− , bench "transient" $ nfIO transient_basic
40− , bench "machines" $ nfIO machines_basic
30+ , bench "machines" $ nfIO machines_basic
41− , bench "stream" $ nfIO stream_basic
42− , bench "conduit" $ nfIO conduit_basic
43− , bench "pipes" $ nfIO pipes_basic
44− , bench "simple-conduit" $ nfIO simple_conduit_basic
45− , bench "iostreams" $ nfIO iostreams_basic
46− -- , bench "fusion" $ nfIO fusion_basic
51{-# INLINABLE map #-}
34{-# INLINABLE map #-}
@@ -77,18 +60,18 @@ tfilter = Main.filter
77tdrop :: Int -> Int -> T.TransIO Int
60tdrop :: Int -> Int -> T.TransIO Int
78tdrop = Main.drop
61tdrop = Main.drop
80−transient_basic :: IO Int
63+transient_basic :: IO (Maybe Int)
81transient_basic = T.keep' $ T.threads 0 $ do
64transient_basic = T.keep' $ T.threads 0 $ do
82 liftIO $ writeIORef count 0
65 liftIO $ writeIORef count 0
83− xs <- T.group 499001 $ do
66+ xs <- T.group 49900 $ do
84− T.choose [1..1000001 :: Int]
67+ T.choose [1..100000 :: Int]
85 >>= tfilter even
68 >>= tfilter even
86 >>= tmap (+1)
69 >>= tmap (+1)
87− >>= tdrop 1000
70+ >>= tdrop 100
88 >>= tmap (+1)
71 >>= tmap (+1)
89 >>= tfilter (\x -> x `mod` 2 == 0)
72 >>= tfilter (\x -> x `mod` 2 == 0)
91− assert (Prelude.length xs == 499000) $
74+ assert (Prelude.length xs == 49900) $
92 T.exit (Prelude.length xs)
75 T.exit (Prelude.length xs)
94amap :: (Int -> Int) -> Int -> A.AsyncT IO Int
77amap :: (Int -> Int) -> Int -> A.AsyncT IO Int
@@ -100,18 +83,20 @@ afilter = Main.filter
100adrop :: Int -> Int -> A.AsyncT IO Int
83adrop :: Int -> Int -> A.AsyncT IO Int
101adrop = Main.drop
84adrop = Main.drop
86+{-# INLINE asyncly_basic #-}
103−asyncly_basic :: IO Int
87+asyncly_basic :: (A.AsyncT IO Int -> A.AsyncT IO Int -> A.AsyncT IO Int)
104−asyncly_basic = do
89+asyncly_basic f = do
105 writeIORef count 0
90 writeIORef count 0
106 xs <- A.toList $ do
91 xs <- A.toList $ do
107− (A.forEachWith (A.<|) [1..1000000 :: Int] $ \x ->
92+ (A.forEachWith f [1..100000 :: Int] $ \x ->
109 >>= afilter even
94 >>= afilter even
110 >>= amap (+1)
95 >>= amap (+1)
111− >>= adrop 1000
96+ >>= adrop 100
112 >>= amap (+1)
97 >>= amap (+1)
113 >>= afilter (\y -> y `mod` 2 == 0))
98 >>= afilter (\y -> y `mod` 2 == 0))
114− assert (Prelude.length xs == 499000) $
99+ assert (Prelude.length xs == 49900) $
115 return (Prelude.length xs)
100 return (Prelude.length xs)
117lfilter :: (Int -> Bool) -> Int -> LT.ListT IO Int
102lfilter :: (Int -> Bool) -> Int -> LT.ListT IO Int
@@ -127,13 +112,13 @@ list_t_basic :: IO Int
127list_t_basic = do
112list_t_basic = do
128 writeIORef count 0
113 writeIORef count 0
129 xs <- LT.toList $ do
114 xs <- LT.toList $ do
130− LT.fromFoldable [1..1000000 :: Int]
115+ LT.fromFoldable [1..100000 :: Int]
131 >>= lfilter even
116 >>= lfilter even
132 >>= lmap (+1)
117 >>= lmap (+1)
133− >>= ldrop 1000
118+ >>= ldrop 100
134 >>= lmap (+1)
119 >>= lmap (+1)
135 >>= lfilter (\x -> x `mod` 2 == 0)
120 >>= lfilter (\x -> x `mod` 2 == 0)
136− assert (Prelude.length xs == 499000) $
121+ assert (Prelude.length xs == 49900) $
137 return (Prelude.length xs)
122 return (Prelude.length xs)
139lgfilter :: (Int -> Bool) -> Int -> LG.LogicT IO Int
124lgfilter :: (Int -> Bool) -> Int -> LG.LogicT IO Int
@@ -150,94 +135,22 @@ logict_basic = do
150 writeIORef count 0
135 writeIORef count 0
151 --xs <- LG.observeManyT 2900 $ do
136 --xs <- LG.observeManyT 2900 $ do
152 xs <- LG.observeAllT $ do
137 xs <- LG.observeAllT $ do
153− LG.msum $ Prelude.map return [1..1000000]
138+ LG.msum $ Prelude.map return [1..100000]
154 >>= lgfilter even
139 >>= lgfilter even
155 >>= lgmap (+1)
140 >>= lgmap (+1)
156− >>= lgdrop 1000
141+ >>= lgdrop 100
157 >>= lgmap (+1)
142 >>= lgmap (+1)
158 >>= lgfilter (\x -> x `mod` 2 == 0)
143 >>= lgfilter (\x -> x `mod` 2 == 0)
159− assert (Prelude.length xs == 499000) $
144+ assert (Prelude.length xs == 49900) $
160 return (Prelude.length xs)
145 return (Prelude.length xs)
162machines_basic :: IO Int
147machines_basic :: IO Int
163machines_basic = do
148machines_basic = do
164− xs <- M.runT $ M.source [1..1000000]
149+ xs <- M.runT $ M.source [1..100000]
165 M.~> M.filtered even
150 M.~> M.filtered even
166 M.~> M.mapping (+1)
151 M.~> M.mapping (+1)
167− M.~> M.dropping 1000
152+ M.~> M.dropping 100
168 M.~> M.mapping (+1)
153 M.~> M.mapping (+1)
169 M.~> M.filtered (\x -> x `mod` 2 == 0)
154 M.~> M.filtered (\x -> x `mod` 2 == 0)
170− assert (Prelude.length xs == 499000) $
155+ assert (Prelude.length xs == 49900) $
171− return (Prelude.length (xs ::[Int]))
173−pipes_basic :: IO Int
175− xs <- P.toListM $ P.each [1..1000000]
180− P.>-> P.filter (\x -> x `mod` 2 == 0)
181− assert (Prelude.length xs == 499000) $
182 return (Prelude.length (xs ::[Int]))
156 return (Prelude.length (xs ::[Int]))
184−conduit_basic :: IO Int
186− xs <- C.yieldMany [1..1000000]
188− C.$= C.map ((+1) :: Int -> Int)
189− C.$= (C.drop 1000 >> C.awaitForever C.yield)
190− C.$= C.map ((+1) :: Int -> Int)
191− C.$= C.filter (\x -> x `mod` 2 == 0)
193− assert (Prelude.length xs == 499000) $
194− return (Prelude.length (xs :: [Int]))
196−simple_conduit_basic :: IO Int
197−simple_conduit_basic = do
198− xs <- S.sourceList [1..1000000]
200− S.$= S.mapC ((+1) :: Int -> Int)
202− S.$= S.mapC ((+1) :: Int -> Int)
203− S.$= S.filterC (\x -> x `mod` 2 == 0)
205− assert (Prelude.length xs == 499000) $
206− return (Prelude.length (xs :: [Int]))
210−-- fusion_basic :: IO Int
212−-- xs <- F.toListM $ F.each [1..1000000]
217−-- & F.filter (\x -> x `mod` 2 == 0)
218−-- assert (Prelude.length xs == 499000) $
219−-- return (Prelude.length (xs :: [Int]))
221−stream_basic :: IO Int
223− let ns = [1..1000000] :: [Int]
224− xs Str.:> _ <- Str.toList $ Str.each ns
229− & Str.filter (\x -> x `mod` 2 == 0)
230− assert (Prelude.length xs == 499000) $
231− return (Prelude.length xs)
233−iostreams_basic :: IO Int
235− s0 <- IOS.fromList [1..1000000]
236− s1 <- IOS.filter even s0
237− s2 <- IOS.map (+1) s1
238− s3 <- IOS.drop 1000 s2
239− s4 <- IOS.map (+1) s3
240− s5 <- IOS.filter (\x -> x `mod` 2 == 0) s4
242− assert (Prelude.length xs == 499000) $
243− return (Prelude.length (xs :: [Int]))