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 ] ]