packages feed

chimera-0.3.1.0: bench/Bench.hs

module Main where

import Control.Monad.State
import Data.Chimera
import Gauge.Main
import System.Random

main :: IO ()
main = defaultMain
  [ bgroup "read/Chimera" (map benchReadChimera [100, 200, 500, 1000])
  , bgroup "read/List"    (map benchReadList    [100, 200, 500, 1000])
  ]

randomChimera :: UChimera Int
randomChimera = flip evalState (mkStdGen 42) $ tabulateM $ const $ do
  g <- get
  let (x, g') = random g
  put g'
  pure x

randomList :: [Int]
randomList = randoms (mkStdGen 42)

randomIndicesWord :: [Word]
randomIndicesWord = randoms (mkStdGen 42)

randomIndicesInt :: [Int]
randomIndicesInt = randoms (mkStdGen 42)

benchReadChimera :: Word -> Benchmark
benchReadChimera n
  = bench (show n)
  $ nf (sum . map (index randomChimera))
  $ map (`rem` n)
  $ take (fromIntegral n) randomIndicesWord

benchReadList :: Int -> Benchmark
benchReadList n
  = bench (show n)
  $ nf (sum . map (randomList !!))
  $ map (`mod` n)
  $ take n randomIndicesInt