packages feed

bspack-0.0.3: Tests/Bench.hs

-- |
-- Module      : Tests.Bench
-- License     : BSD-Style
-- Copyright   : Copyright © 2014 Nicolas DI PRIMA
--
-- Maintainer  : Nicolas DI PRIMA <nicolas@di-prima.fr>
-- Stability   : experimental
-- Portability : unknown
--
{-# LANGUAGE OverloadedStrings #-}
module Main (main) where

import Criterion.Main

import Data.ByteString.Pack
import Data.ByteString.Pack.Base32
import Data.ByteString (ByteString)
import qualified Data.ByteString as B
import qualified Data.ByteString.Builder as B
import Data.Word

import Data.Monoid
import qualified Blaze.ByteString.Builder as Blaze
import qualified Blaze.ByteString.Builder.Char8 as Blaze

main :: IO ()
main = defaultMain
    [ bgroup "just fill up with the same char" benchFillUpWith
    , bgroup "write a bytestring" benchWriteByteString
    , bgroup "write byte and bytestring" benchConcatBytes
    , bgroup "base32" benchBase32
    ]

benchFillUpWith =
    [ bench "bytestring: replicate" $ whnf (flip B.replicate 0x41) 2048
    , bench "bspack: fillUpWith" $ whnf (pack (fillUpWith (0x41 :: Word8))) 2048
    ]

exampleByteString :: B.ByteString
exampleByteString = B.replicate 1024 0x42

benchWriteByteString =
    [ bench "blaze" $ whnf (Blaze.toByteString) (Blaze.copyByteString exampleByteString)
    , bench "bytestring" $ nf (B.toLazyByteString) (B.byteString exampleByteString)
    , bench "bspack" $ whnf (flip pack 1024) (putByteString exampleByteString)
    ]

exampleShortByteString :: B.ByteString
exampleShortByteString = "Haskell rocks!"

concatPacker :: Packer ()
concatPacker = do
    putByteString exampleShortByteString
    putWord8 0x20

concatBlaze :: Blaze.Builder
concatBlaze =
      Blaze.copyByteString exampleShortByteString
   <> Blaze.fromChar ' '

concatBlazeShort :: Blaze.Builder
concatBlazeShort = mconcat $ replicate 5 concatBlaze

concatPackerShort :: Packer ()
concatPackerShort = sequence_ $ replicate 5 concatPacker

concatBlazeLong :: Blaze.Builder
concatBlazeLong = mconcat $ replicate 30 concatBlaze

concatPackerLong :: Packer ()
concatPackerLong = sequence_ $ replicate 30 concatPacker

benchConcatBytes =
    [ bench "blaze"       $ whnf (Blaze.toByteString) concatBlazeShort
    , bench "bspack"      $ whnf (flip pack 1024)     concatPackerShort
    , bench "blaze lazy"  $ nf (Blaze.toLazyByteString) concatBlazeLong
    , bench "blaze long"  $ whnf (Blaze.toByteString) concatBlazeLong
    , bench "bspack long" $ whnf (flip pack 2048)     concatPackerLong
    ]

benchBase32 =
    [ bench "bspack 512B" $ whnf (\bs -> pack (putByteStringBase32 bs) 824)      $! B.replicate 512      0x42
    , bench "bspack 10KB" $ whnf (\bs -> pack (putByteStringBase32 bs) 16000)    $! B.replicate 10000    0x42
    , bench "bspack 1MB"  $ whnf (\bs -> pack (putByteStringBase32 bs) 1600000)  $! B.replicate 1000000  0x42
    , bench "bspack 10MB" $ whnf (\bs -> pack (putByteStringBase32 bs) 16000000) $! B.replicate 10000000 0x42
    ]