{-# LANGUAGE MagicHash, ScopedTypeVariables, UnboxedTuples, BangPatterns, OverlappingInstances, TypeFamilies, OverloadedStrings, NoMonomorphismRestriction, FlexibleInstances, FlexibleContexts, FunctionalDependencies, MultiParamTypeClasses, RankNTypes, DataKinds, GADTs, GeneralizedNewtypeDeriving, TemplateHaskell #-}
module Main
( main
, foo
, bar
, baz
, fast
, fastST ) where
import Criterion
import Criterion.Main
import Criterion.Types
import Data.IORef
import Data.STRef
import qualified Data.List.Stream as S
import Control
.Monad.Stream
import Control
.Monad.Trans
import Control
.Monad.Trans
.RWS
.Strict
import Control
.Monad.Trans
.State
.Strict
import Data.Text (Text)
import qualified Data.Text as T
newtype Foo a
= Foo
{ runFoo
:: IO a
} newtype Bar a
= Bar
{ unBar
:: StateT
Int IO a
} newtype Baz a
= Baz
{ unBaz
:: RWST
Int [Text
] Int (StateT
Int IO) a
}
runBar x
= (flip evalStateT
) 0 . unBar
$ x
runBaz x
= (flip evalStateT
) 0 . liftM
fst . (\y
-> evalRWST y
0 0) . unBaz
$ x
foo inp = Foo $ do
x <- newIORef inp
replicateM_ n $ do
modifyIORef x (+1)
readIORef x
bar inp = Bar $ do
x <- liftIO $ newIORef inp
replicateM_ n $ do
liftIO $ modifyIORef x (\i -> i + 1)
liftIO $ readIORef x
baz inp = Baz $ do
x <- liftIO $ newIORef inp
replicateM_ n $ do
liftIO $ modifyIORef x (+1)
liftIO $ readIORef x
fast 0 acc = acc
fast k acc = fast (k - 1) (acc + 1)
fastST inp = runST $ do
x <- newSTRef inp
replicateM_ n $ do
modifySTRef x (\i -> i +1)
readSTRef x
main = defaultMain $
[ bench "IO: " $ runFoo $ foo 0
, bench "IO with StateT: " $ runBar $ bar 0
, bench "IO with StateT and RWST: " $ runBaz $ baz 0
, bench "Pure: " $ whnf (\x -> fast x 0) n
, bench "Pure with ST: " $ whnf (\x -> fastST x) n ]
ey0jIExBTkdVQUdFIE1hZ2ljSGFzaCwgU2NvcGVkVHlwZVZhcmlhYmxlcywgVW5ib3hlZFR1cGxlcywgQmFuZ1BhdHRlcm5zLCBPdmVybGFwcGluZ0luc3RhbmNlcywgVHlwZUZhbWlsaWVzLCBPdmVybG9hZGVkU3RyaW5ncywgTm9Nb25vbW9ycGhpc21SZXN0cmljdGlvbiwgRmxleGlibGVJbnN0YW5jZXMsIEZsZXhpYmxlQ29udGV4dHMsIEZ1bmN0aW9uYWxEZXBlbmRlbmNpZXMsIE11bHRpUGFyYW1UeXBlQ2xhc3NlcywgUmFua05UeXBlcywgRGF0YUtpbmRzLCBHQURUcywgR2VuZXJhbGl6ZWROZXd0eXBlRGVyaXZpbmcsIFRlbXBsYXRlSGFza2VsbCAjLX0KbW9kdWxlIE1haW4KICAoIG1haW4KICAsIGZvbwogICwgYmFyCiAgLCBiYXoKICAsIGZhc3QKICAsIGZhc3RTVCApIHdoZXJlCgppbXBvcnQgICAgICAgICAgIENyaXRlcmlvbgppbXBvcnQgICAgICAgICAgIENyaXRlcmlvbi5NYWluCmltcG9ydCAgICAgICAgICAgQ3JpdGVyaW9uLlR5cGVzCmltcG9ydCAgICAgICAgICAgRGF0YS5JT1JlZgppbXBvcnQgICAgICAgICAgIERhdGEuU1RSZWYKaW1wb3J0IHF1YWxpZmllZCBEYXRhLkxpc3QuU3RyZWFtIGFzIFMKaW1wb3J0ICAgICAgICAgICBDb250cm9sLk1vbmFkLlNUCmltcG9ydCAgICAgICAgICAgQ29udHJvbC5Nb25hZC5TdHJlYW0KaW1wb3J0ICAgICAgICAgICBDb250cm9sLk1vbmFkLlRyYW5zCmltcG9ydCAgICAgICAgICAgQ29udHJvbC5Nb25hZC5UcmFucy5SV1MuU3RyaWN0CmltcG9ydCAgICAgICAgICAgQ29udHJvbC5Nb25hZC5UcmFucy5TdGF0ZS5TdHJpY3QKaW1wb3J0ICAgICAgICAgICBDb250cm9sLk1vbmFkLlRyYW5zLk1heWJlCmltcG9ydCAgICAgICAgICAgRGF0YS5UZXh0IChUZXh0KQppbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dCBhcyBUCgpuZXd0eXBlIEZvbyBhID0gRm9vIHsgcnVuRm9vIDo6IElPIGEgfQpuZXd0eXBlIEJhciBhID0gQmFyIHsgdW5CYXIgOjogU3RhdGVUIEludCBJTyBhIH0KbmV3dHlwZSBCYXogYSA9IEJheiB7IHVuQmF6IDo6IFJXU1QgSW50IFtUZXh0XSBJbnQgKFN0YXRlVCBJbnQgSU8pIGEgfQoKcnVuQmFyIHggPSAoZmxpcCBldmFsU3RhdGVUKSAwIC4gdW5CYXIgJCB4CnJ1bkJheiB4ID0gKGZsaXAgZXZhbFN0YXRlVCkgMCAuIGxpZnRNIGZzdCAuIChceSAtPiBldmFsUldTVCB5IDAgMCkgLiB1bkJheiAkIHgKCm4gPSAxMDAwMCA6OiBJbnQKCmZvbyA6OiBJbnQgLT4gRm9vIEludApmb28gaW5wID0gRm9vICQgZG8KICB4IDwtIG5ld0lPUmVmIGlucAogIHJlcGxpY2F0ZU1fIG4gJCBkbwogICAgbW9kaWZ5SU9SZWYgeCAoKzEpCiAgcmVhZElPUmVmIHgKCmJhciA6OiBJbnQgLT4gQmFyIEludApiYXIgaW5wID0gQmFyICQgZG8KICB4IDwtIGxpZnRJTyAkIG5ld0lPUmVmIGlucAogIHJlcGxpY2F0ZU1fIG4gJCBkbwogICAgbGlmdElPICQgbW9kaWZ5SU9SZWYgeCAoXGkgLT4gaSArIDEpCiAgbGlmdElPICQgcmVhZElPUmVmIHgKCmJheiA6OiBJbnQgLT4gQmF6IEludApiYXogaW5wID0gQmF6ICQgZG8KICB4IDwtIGxpZnRJTyAkIG5ld0lPUmVmIGlucAogIHJlcGxpY2F0ZU1fIG4gJCBkbwogICAgbGlmdElPICQgbW9kaWZ5SU9SZWYgeCAoKzEpCiAgbGlmdElPICQgcmVhZElPUmVmIHgKCmZhc3QgOjogSW50IC0+IEludCAtPiBJbnQKZmFzdCAwIGFjYyA9IGFjYwpmYXN0IGsgYWNjID0gZmFzdCAoayAtIDEpIChhY2MgKyAxKQoKZmFzdFNUIDo6IEludCAtPiBJbnQKZmFzdFNUIGlucCA9IHJ1blNUICQgZG8KICB4IDwtIG5ld1NUUmVmIGlucAogIHJlcGxpY2F0ZU1fIG4gJCBkbwogICAgbW9kaWZ5U1RSZWYgeCAoXGkgLT4gaSArMSkKICByZWFkU1RSZWYgeAoKbWFpbiA9IGRlZmF1bHRNYWluICQKICBbIGJlbmNoICJJTzogIiAgICAgICAgICAgICAgICAgICAgICAgJCBydW5Gb28gJCBmb28gMAogICwgYmVuY2ggIklPIHdpdGggU3RhdGVUOiAiICAgICAgICAgICAkIHJ1bkJhciAkIGJhciAwCiAgLCBiZW5jaCAiSU8gd2l0aCBTdGF0ZVQgYW5kIFJXU1Q6ICIgICQgcnVuQmF6ICQgYmF6IDAgCiAgLCBiZW5jaCAiUHVyZTogIiAgICAgICAgICAgICAgICAgICAgICQgd2huZiAoXHggLT4gZmFzdCB4IDApIG4KICAsIGJlbmNoICJQdXJlIHdpdGggU1Q6ICIgICAgICAgICAgICAgJCB3aG5mIChceCAtPiBmYXN0U1QgeCkgbiBd