hw-excess-0.2.2.3: bench/Main.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Criterion.Main
import Data.Word
import HaskellWorks.Data.Excess.MinMaxExcess0
import HaskellWorks.Data.Excess.MinMaxExcess1
import HaskellWorks.Data.Excess.PartialMinMaxExcess0
import HaskellWorks.Data.Excess.PartialMinMaxExcess1
import HaskellWorks.Data.Excess.Triplet
import HaskellWorks.Data.Vector.AsVector64
import qualified Data.ByteString.Lazy as LBS
import qualified Data.Vector.Storable as DVS
setupEnvExcess :: Int -> IO (DVS.Vector Word64)
setupEnvExcess n = do
lbs <- LBS.readFile "/dev/random"
return (asVector64 (LBS.toStrict (LBS.take (fromIntegral n) lbs)))
runPartialMinMaxExcess0Vector :: DVS.Vector Word64 -> IO ()
runPartialMinMaxExcess0Vector v = do
let !_ = DVS.foldl go 0 v
return ()
where go :: Int -> Word64 -> Int
go a b = a + lo + ex + hi
where c = fromIntegral b :: Word64
Triplet lo ex hi = partialMinMaxExcess0 64 c
runPartialMinMaxExcess1Vector :: DVS.Vector Word64 -> IO ()
runPartialMinMaxExcess1Vector v = do
let !_ = DVS.foldl go 0 v
return ()
where go :: Int -> Word64 -> Int
go a b = a + lo + ex + hi
where c = fromIntegral b :: Word64
Triplet lo ex hi = partialMinMaxExcess1 64 c
runMinMaxExcess0VectorElems :: DVS.Vector Word64 -> IO ()
runMinMaxExcess0VectorElems v = do
let !_ = DVS.foldl go 0 v
return ()
where go :: Int -> Word64 -> Int
go a b = a + lo + ex + hi
where Triplet lo ex hi = minMaxExcess0 (b :: Word64)
runMinMaxExcess1VectorElems :: DVS.Vector Word64 -> IO ()
runMinMaxExcess1VectorElems v = do
let !_ = DVS.foldl go 0 v
return ()
where go :: Int -> Word64 -> Int
go a b = a + lo + ex + hi
where Triplet lo ex hi = minMaxExcess1 (b :: Word64)
runMinMaxExcess0Vector :: DVS.Vector Word64 -> IO ()
runMinMaxExcess0Vector v = do
let !_ = minMaxExcess1 v
return ()
runMinMaxExcess1Vector :: DVS.Vector Word64 -> IO ()
runMinMaxExcess1Vector v = do
let !_ = minMaxExcess1 v
return ()
makeBenchExcess :: IO [Benchmark]
makeBenchExcess = return $
[ env (setupEnvExcess (1024 * 1024)) $ \v -> bgroup "MinMaxExcess Vector"
[ bench "MinMaxExcess0" (whnfIO (runMinMaxExcess0VectorElems v))
, bench "MinMaxExcess1" (whnfIO (runMinMaxExcess1VectorElems v))
, bench "MinMaxExcess0" (whnfIO (runMinMaxExcess0Vector v))
, bench "MinMaxExcess1" (whnfIO (runMinMaxExcess1Vector v))
]
, env (setupEnvExcess (1024 * 1024)) $ \v -> bgroup "PartialMinMaxExcess Vector"
[ bench "PartialMinMaxExcess0" (whnfIO (runPartialMinMaxExcess0Vector v))
, bench "PartialMinMaxExcess1" (whnfIO (runPartialMinMaxExcess1Vector v))
]
]
main :: IO ()
main = do
benchmarks <- mconcat <$> sequence
[ makeBenchExcess
]
defaultMain benchmarks