packages feed

hcobs-0.1.0.0: bench/MainBench.hs

{-# LANGUAGE TypeInType #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PartialTypeSignatures #-}

import           Criterion.Main
import Data.ByteString (useAsCStringLen, packCStringLen)
import           Data.ByteString.Lazy hiding (replicate)
import qualified Data.ByteString.Lazy as BSL
import Data.ByteString.Base64 (encode, decode)
import           Data.Stuffed
import           Prelude              hiding (concat)
import           System.IO.Unsafe     (unsafePerformIO)

stuffedRt = unstuff . (stuff :: _ -> Stuffed 0)
cStringRt = fromStrict . unsafePerformIO . flip useAsCStringLen packCStringLen . toStrict
base64Rt = fromStrict . (\(Right x) -> x) . decode . encode . toStrict

benchStuffing :: (ByteString -> ByteString) -> [Benchmark]
benchStuffing roundTrip =
    [ bench "empty" $ nf roundTrip ""
    , bench "allbytes" $ nf roundTrip $ concat $ replicate 40 $ pack [0..255]
    , bench "allzeros" $ nf roundTrip $ BSL.replicate 10000 0
    ]

main = defaultMain [
      bgroup "stuff/unstuff" $ benchStuffing stuffedRt
    , bgroup "base64" $ benchStuffing base64Rt
    , bgroup "asCString/packCString" $ benchStuffing cStringRt
    ]