From 74ea0e872306a71b9b48ba0d7cbe499c0a5be3dd Mon Sep 17 00:00:00 2001 From: Bryan O'Sullivan Date: Sat, 19 Sep 2009 22:27:48 +0000 Subject: [PATCH] Time the system PRNG, for the lulz. --- tests/T.hs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/tests/T.hs b/tests/T.hs index 9ed8aa96..141f8cc8 100644 --- a/tests/T.hs +++ b/tests/T.hs @@ -9,7 +9,8 @@ import Control.Monad.ST import Data.Time.Clock.POSIX import Data.Array.Vector import Statistics.RandomVariate -import System.Random.Mersenne +import qualified System.Random as R +import qualified System.Random.Mersenne as M getTime :: IO Double getTime = (fromRational . toRational) `fmap` getPOSIXTime @@ -21,9 +22,9 @@ time act = do e <- ret `seq` getTime return (e-s, ret) -count = 250 * 1000000 +count = 100 * 1000000 -type T = Word32 +type T = Double --summ :: [T] -> T --summ = foldl' (+) 0 @@ -36,6 +37,18 @@ loop n act = go 0 0 d <- act go (i+1) (s+d) +system :: IO Double +system = do + gen <- R.getStdGen + let a :*: g = loop 0 0 gen + R.setStdGen g + return a + where loop !i !a !g | i == k = a :*: g + | otherwise = let (b,h) = R.random g + in loop (i+1) (a+b) h + k = count `div` 100 + + mwc :: Word32 -> IO T mwc k = return $! runST go where go = do @@ -50,11 +63,13 @@ mwca k = return $! runST go where mersenne :: IO T mersenne = do - gen <- getStdGen - loop count (random gen) + gen <- M.getStdGen + loop count (M.random gen) main = do forM_ [1..3] $ \n -> do + putStr "system: " + print =<< time system putStr "mwc: " print =<< time (mwc n) putStr "mwca: "