Blame bench/bench.hs

Packit 1d883e
{-# LANGUAGE DeriveDataTypeable, RankNTypes #-}
Packit 1d883e
Packit 1d883e
module Main where
Packit 1d883e
Packit 1d883e
Packit 1d883e
--------------------------------------------------------------------------------
Packit 1d883e
-- Imports
Packit 1d883e
--------------------------------------------------------------------------------
Packit 1d883e
Packit 1d883e
-- from base:
Packit 1d883e
import Prelude hiding (catch)
Packit 1d883e
import Control.Exception ( Exception, SomeException, throwIO )
Packit 1d883e
import qualified Control.Exception as E ( mask, bracket, bracket_ )
Packit 1d883e
import Data.Typeable
Packit 1d883e
import Control.Monad (join)
Packit 1d883e
Packit 1d883e
-- from criterion:
Packit 1d883e
import Criterion.Main
Packit 1d883e
Packit 1d883e
-- from transformers:
Packit 1d883e
import Control.Monad.IO.Class
Packit 1d883e
import Control.Monad.Trans.Maybe
Packit 1d883e
import Control.Monad.Trans.Reader
Packit 1d883e
import Control.Monad.Trans.State
Packit 1d883e
import Control.Monad.Trans.Writer
Packit 1d883e
Packit 1d883e
-- from monad-peel:
Packit 1d883e
import qualified Control.Exception.Peel as MP
Packit 1d883e
import qualified Control.Monad.IO.Peel  as MP
Packit 1d883e
Packit 1d883e
-- from monad-control:
Packit 1d883e
import qualified Control.Monad.Trans.Control as MC
Packit 1d883e
Packit 1d883e
-- from lifted-base:
Packit 1d883e
import qualified Control.Exception.Lifted as MC
Packit 1d883e
Packit 1d883e
Packit 1d883e
--------------------------------------------------------------------------------
Packit 1d883e
-- Main
Packit 1d883e
--------------------------------------------------------------------------------
Packit 1d883e
Packit 1d883e
main :: IO ()
Packit 1d883e
main = defaultMain
Packit 1d883e
  [ b "bracket"   benchBracket  MP.bracket   MC.bracket
Packit 1d883e
  , b "bracket_"  benchBracket_ MP.bracket_  MC.bracket_
Packit 1d883e
  , b "catch"     benchCatch    MP.catch     MC.catch
Packit 1d883e
  , b "try"       benchTry      MP.try       MC.try
Packit 1d883e
Packit 1d883e
  , bgroup "mask"
Packit 1d883e
    [ bench "monad-peel"    $ whnfIO $ benchMask mpMask
Packit 1d883e
    , bench "monad-control" $ whnfIO $ benchMask MC.mask
Packit 1d883e
    ]
Packit 1d883e
Packit 1d883e
  , bgroup "liftIOOp"
Packit 1d883e
    [ bench "monad-peel"    $ whnfIO $ exe $ MP.liftIOOp   (E.bracket nop (\_ -> nop))
Packit 1d883e
                                                           (\_ -> nop)
Packit 1d883e
    , bench "monad-control" $ whnfIO $ exe $ MC.liftBaseOp (E.bracket nop (\_ -> nop))
Packit 1d883e
                                                           (\_ -> nop)
Packit 1d883e
    ]
Packit 1d883e
Packit 1d883e
  , bgroup "liftIOOp_"
Packit 1d883e
    [ bench "monad-peel"    $ whnfIO $ exe $ MP.liftIOOp_   (E.bracket_ nop nop) nop
Packit 1d883e
    , bench "monad-control" $ whnfIO $ exe $ MC.liftBaseOp_ (E.bracket_ nop nop) nop
Packit 1d883e
    ]
Packit 1d883e
  ]
Packit 1d883e
Packit 1d883e
b name bnch peel mndCtrl = bgroup name
Packit 1d883e
  [ bench "monad-peel"    $ whnfIO $ bnch peel
Packit 1d883e
  , bench "monad-control" $ whnfIO $ bnch mndCtrl
Packit 1d883e
  ]
Packit 1d883e
Packit 1d883e
--------------------------------------------------------------------------------
Packit 1d883e
-- Monad stack
Packit 1d883e
--------------------------------------------------------------------------------
Packit 1d883e
Packit 1d883e
type M a = ReaderT Int (StateT Bool (WriterT String (MaybeT IO))) a
Packit 1d883e
Packit 1d883e
type R a = IO (Maybe ((a, Bool), String))
Packit 1d883e
Packit 1d883e
runM :: Int -> Bool -> M a -> R a
Packit 1d883e
runM r s m = runMaybeT (runWriterT (runStateT (runReaderT m r) s))
Packit 1d883e
Packit 1d883e
exe :: M a -> R a
Packit 1d883e
exe = runM 0 False
Packit 1d883e
Packit 1d883e
Packit 1d883e
--------------------------------------------------------------------------------
Packit 1d883e
-- Benchmarks
Packit 1d883e
--------------------------------------------------------------------------------
Packit 1d883e
Packit 1d883e
benchBracket   bracket   = exe $              bracket  nop (\_ -> nop)  (\_ -> nop)
Packit 1d883e
benchBracket_  bracket_  = exe $              bracket_ nop nop          nop
Packit 1d883e
benchCatch     catch     = exe $ catch throwE (\E -> nop)
Packit 1d883e
benchTry       try       = exe $ try throwE :: R (Either E ())
Packit 1d883e
Packit 1d883e
benchMask :: (((forall a. M a -> M a) -> M ()) -> M ()) -> R ()
Packit 1d883e
benchMask mask = exe $ mask $ \restore -> nop >> restore nop >> nop
Packit 1d883e
Packit 1d883e
Packit 1d883e
--------------------------------------------------------------------------------
Packit 1d883e
-- Utils
Packit 1d883e
--------------------------------------------------------------------------------
Packit 1d883e
Packit 1d883e
nop :: Monad m => m ()
Packit 1d883e
nop = return ()
Packit 1d883e
Packit 1d883e
data E = E deriving (Show, Typeable)
Packit 1d883e
Packit 1d883e
instance Exception E
Packit 1d883e
Packit 1d883e
throwE :: MonadIO m => m ()
Packit 1d883e
throwE = liftIO $ throwIO E
Packit 1d883e
Packit 1d883e
mpMask :: MP.MonadPeelIO m => ((forall a. m a -> m a) -> m b) -> m b
Packit 1d883e
mpMask f = do
Packit 1d883e
  k <- MP.peelIO
Packit 1d883e
  join $ liftIO $ E.mask $ \restore -> k $ f $ MP.liftIOOp_ restore