streamly-0.8.2: benchmark/Streamly/Benchmark/Data/Array/SmallArray.hs
{-# LANGUAGE CPP #-}
#include "Streamly/Benchmark/Data/Array/CommonImports.hs"
import Control.DeepSeq (deepseq)
import qualified Streamly.Internal.Data.SmallArray as A
type Stream = A.SmallArray
#include "Streamly/Benchmark/Data/Array/Common.hs"
-------------------------------------------------------------------------------
-- Benchmark helpers
-------------------------------------------------------------------------------
-- Drain a source that generates an array in the IO monad
{-# INLINE benchIOSrc #-}
benchIOSrc :: NFData a => String -> (Int -> IO (Stream a)) -> Benchmark
benchIOSrc name src = benchIO name src id
-------------------------------------------------------------------------------
-- Bench Ops
-------------------------------------------------------------------------------
{-# INLINE sourceIntFromToFromList #-}
sourceIntFromToFromList :: MonadIO m => Int -> Int -> m (Stream Int)
sourceIntFromToFromList value n = P.return $ A.fromListN value [n..n + value]
{-# INLINE readInstance #-}
readInstance :: P.String -> Stream Int
readInstance str =
let r = P.reads str
in case r of
[(x,"")] -> x
_ -> P.error "readInstance: no parse"
#ifdef DEVBUILD
{-
{-# INLINE foldableFoldl' #-}
foldableFoldl' :: Stream Int -> Int
foldableFoldl' = F.foldl' (+) 0
{-# INLINE foldableSum #-}
foldableSum :: Stream Int -> Int
foldableSum = P.sum
-}
#endif
-------------------------------------------------------------------------------
-- Bench groups
-------------------------------------------------------------------------------
o_1_space_generation :: Int -> [Benchmark]
o_1_space_generation value =
[ bgroup
"generation"
[ let testStr =
"fromListN " ++
show (value + 1) ++
"[1" ++ concat (replicate value ",1") ++ "]"
in testStr `deepseq` bench "read" (nf readInstance testStr)
]
]
{-
o_1_space_elimination :: Int -> [Benchmark]
o_1_space_elimination value =
[ bgroup "elimination"
[
#ifdef DEVBUILD
{-
benchPureSink value "foldable/foldl'" foldableFoldl'
, benchPureSink value "foldable/sum" foldableSum
-}
#endif
]
]
-}
moduleName :: String
moduleName = "Data.SmallArray"
defStreamSize :: Int
defStreamSize = 128
main :: IO ()
main = runWithCLIOpts defStreamSize allBenchmarks
where
allBenchmarks size =
bgroup (o_1_space_prefix moduleName) (o_1_space_generation size)
: commonBenchmarks size