packages feed

xorshift-plus-0.1.0.0: benchmarks/micro/micro.hs

{-# LANGUAGE TypeApplications #-}

module Main where

import Gauge.Main
import Data.Int
import Data.Word
import System.Random
import Random.XorshiftPlus
import Random.Xorshift.Int32
import Random.Xorshift.Int64
import qualified System.Random.Xorshift128Plus as X128
import System.CPUTime

size :: Int
size = 1000

getSeed :: Num a => IO a
getSeed = fromInteger `fmap` getCPUTime

getRandomIntList :: Int -> IO [Int]
getRandomIntList n = do
  seed <- getSeed @ Int
  xorshift <- genXorshiftPlusInt seed
  sequence $ replicate n $ getInt xorshift

getRandomWordList :: Int -> IO [Word]
getRandomWordList n = do
  seed <- getSeed @ Word
  xorshift <- genXorshiftPlusWord seed
  sequence $ replicate n $ getWord xorshift

getRandomIntList_xorshift_Int32 :: Int -> IO [Int32]
getRandomIntList_xorshift_Int32 n = do
  seed <- getSeed @ Int32
  let xorshift = makeXorshift32 seed
  return $ take n $ randoms xorshift

getRandomIntList_xorshift_Int64 :: Int -> IO [Int64]
getRandomIntList_xorshift_Int64 n = do
  seed <- getSeed @ Int64
  let xorshift = makeXorshift64 seed
  return $ take n $ randoms xorshift

getRandomWord64List_Xorshift128Plus :: Int -> IO [Word64]
getRandomWord64List_Xorshift128Plus n = do
  seed <- getSeed @ Word64
  let xorshift = X128.initialize seed
  return $ take n $ makeList xorshift
  where
    makeList gen = let (x, gen') = X128.next gen in x : (makeList gen')

main :: IO ()
main = defaultMain
  [ bgroup "compareWithOtherPRNGs"
    [ bench "xorshift-plus_Int (THIS PACKAGE)" $ nfIO (getRandomIntList size)
    , bench "xorshift-plus_Word (THIS PACKAGE)" $ nfIO (getRandomWordList size)
    , bench "xorshift_Int32" $ nfIO (getRandomIntList_xorshift_Int32 size)
    , bench "xorshift_Ina64" $ nfIO (getRandomIntList_xorshift_Int64 size)
    , bench "Xorshift128Plus_Word64" $ nfIO (getRandomWord64List_Xorshift128Plus size)
    ]
  ]