packages feed

crc32c-0.2.0: bench/Bench.hs

{-# LANGUAGE BangPatterns #-}
module Main where

import qualified Data.ByteString as BS
import           Data.ByteString (ByteString)
import           Data.Word
import           Criterion.Main

import           Data.Digest.CRC32C

main =
  defaultMain [
    env (pure (largeByteString (2^8) 42)) $ \bs ->
    bench "crc32c small (2^8)" $ whnf crc32c bs

  , env (pure (largeByteString (2^16) 42)) $ \bs ->
    bench "crc32c large (2^16)" $ whnf crc32c bs

  , env (pure (largeByteString (2^16+1) 42)) $ \bs ->
    bench "crc32c large (2^16+1)" $ whnf crc32c bs
  ]

largeByteString :: Int -> Word -> ByteString
largeByteString n seed =
    fst $ BS.unfoldrN n (Just . step) seed
  where
    -- C11 example linear congruential generator
    step :: Word -> (Word8, Word)
    step rng = (w8, rng')
      where
        !rng' = rng * 1103515245 + 12345
        !w8   = fromIntegral (rng' `div` 65536)