packages feed

bits-conduit-0.2.0.0: bench.hs

import Control.Applicative
import Control.Monad
import Criterion.Main
import qualified Data.ByteString as S
import Data.Conduit
import qualified Data.Conduit.List as CL
import Data.Word
import System.Random

import Data.Conduit.Bits

encode :: Bool -> Int -> IO ()
encode b n =
  replicateM_ n (yield b) =$= encodeBits $$ CL.sinkNull

encodes :: [Bool] -> IO ()
encodes bs =
  forM_ bs yield =$= encodeBits $$ CL.sinkNull

decode :: Word8 -> Int -> IO Int
decode b8 n =
  yield (S.replicate n b8) =$= decodeBits $$ CL.fold (\a _ -> a + 1) 0

decodes :: S.ByteString  -> IO Int
decodes bs =
  yield bs =$= decodeBits $$ CL.fold (\a _ -> a + 1) 0

main :: IO ()
main = do
  let size = 100000
      bsize = size `div` 8
  rb  <- replicateM size randomIO
  rbs <- S.pack <$> replicateM bsize randomIO

  defaultMain
    [ bgroup ("encode/" ++ show size)
      [ bench "0s" $ whnfIO $ encode False size
      , bench "1s" $ whnfIO $ encode True  size
      , bench "Rs" $ whnfIO $ encodes rb
      ]

    , bgroup ("decode/" ++ show size)
      [ bench "0s" $ whnfIO $ decode 0x00 bsize
      , bench "1s" $ whnfIO $ decode 0xFF bsize
      , bench "Rs" $ whnfIO $ decodes rbs
      ]
    ]