mwc-random-0.11.0.0: benchmarks/Benchmark.hs
import Control.Exception
import Control.Monad.ST
import Criterion.Main
import Data.Int
import Data.Word
import qualified System.Random as R
import System.Random.MWC
import System.Random.MWC.Distributions
import qualified System.Random.Mersenne as M
main = do
mwc <- create
mtg <- M.newMTGen . Just =<< uniform mwc
defaultMain
[ bgroup "mwc"
-- One letter group names are used so they will fit on the plot.
--
-- U - uniform
-- R - uniformR
-- D - distribution
[ bgroup "U"
[ bench "Double" (uniform mwc :: IO Double)
, bench "Int" (uniform mwc :: IO Int)
, bench "Int8" (uniform mwc :: IO Int8)
, bench "Int16" (uniform mwc :: IO Int16)
, bench "Int32" (uniform mwc :: IO Int32)
, bench "Int64" (uniform mwc :: IO Int64)
, bench "Word" (uniform mwc :: IO Word)
, bench "Word8" (uniform mwc :: IO Word8)
, bench "Word16" (uniform mwc :: IO Word16)
, bench "Word32" (uniform mwc :: IO Word32)
, bench "Word64" (uniform mwc :: IO Word64)
]
, bgroup "R"
-- I'm not entirely convinced that this is right way to test
-- uniformR. /A.Khudyakov/
[ bench "Double" (uniformR (-3.21,26) mwc :: IO Double)
, bench "Int" (uniformR (-12,679) mwc :: IO Int)
, bench "Int8" (uniformR (-12,4) mwc :: IO Int8)
, bench "Int16" (uniformR (-12,679) mwc :: IO Int16)
, bench "Int32" (uniformR (-12,679) mwc :: IO Int32)
, bench "Int64" (uniformR (-12,679) mwc :: IO Int64)
, bench "Word" (uniformR (34,633) mwc :: IO Word)
, bench "Word8" (uniformR (34,63) mwc :: IO Word8)
, bench "Word16" (uniformR (34,633) mwc :: IO Word16)
, bench "Word32" (uniformR (34,633) mwc :: IO Word32)
, bench "Word64" (uniformR (34,633) mwc :: IO Word64)
]
, bgroup "D"
[ bench "standard" (standard mwc :: IO Double)
, bench "normal" (normal 1 3 mwc :: IO Double)
, bench "exponential" (exponential 3 mwc :: IO Double)
, bench "gamma,a<1" (gamma 0.5 1 mwc :: IO Double)
, bench "gamma,a>1" (gamma 2 1 mwc :: IO Double)
, bench "chiSquare" (chiSquare 4 mwc :: IO Double)
]
]
, bgroup "random"
[
bench "Double" (R.randomIO >>= evaluate :: IO Double)
, bench "Int" (R.randomIO >>= evaluate :: IO Int)
]
, bgroup "mersenne"
[
bench "Double" (M.random mtg :: IO Double)
, bench "Int" (M.random mtg :: IO Int)
]
]