Blame bench/blaze.hs

Packit 4b2029
{-# LANGUAGE OverloadedStrings #-}
Packit 4b2029
import Data.Conduit
Packit 4b2029
import qualified Data.Conduit.List as CL
Packit 4b2029
import Data.Conduit.Blaze
Packit 4b2029
import Criterion.Main
Packit 4b2029
import Blaze.ByteString.Builder
Packit 4b2029
import Data.Monoid
Packit 4b2029
import qualified Data.ByteString.Builder as BS
Packit 4b2029
import Data.Functor.Identity (runIdentity)
Packit 4b2029
import Control.Monad.ST (runST)
Packit 4b2029
import Data.ByteString.Lazy.Internal (defaultChunkSize)
Packit 4b2029
Packit 4b2029
count :: Int
Packit 4b2029
count = 100000
Packit 4b2029
Packit 4b2029
single :: Builder
Packit 4b2029
single = copyByteString "Hello World!\n"
Packit 4b2029
Packit 4b2029
oneBuilderLeft :: Builder
Packit 4b2029
oneBuilderLeft =
Packit 4b2029
    loop count mempty
Packit 4b2029
  where
Packit 4b2029
    loop 0 b = b
Packit 4b2029
    loop i b = loop (i - 1) (b <> single)
Packit 4b2029
Packit 4b2029
oneBuilderRight :: Builder
Packit 4b2029
oneBuilderRight =
Packit 4b2029
    loop count mempty
Packit 4b2029
  where
Packit 4b2029
    loop 0 b = b
Packit 4b2029
    loop i b = loop (i - 1) (b <> single)
Packit 4b2029
Packit 4b2029
builderSource :: Monad m => Source m Builder
Packit 4b2029
builderSource = CL.replicate count single
Packit 4b2029
Packit 4b2029
singleBS :: BS.Builder
Packit 4b2029
singleBS = BS.shortByteString "Hello World!\n"
Packit 4b2029
Packit 4b2029
oneBSBuilderLeft :: BS.Builder
Packit 4b2029
oneBSBuilderLeft =
Packit 4b2029
    loop count mempty
Packit 4b2029
  where
Packit 4b2029
    loop 0 b = b
Packit 4b2029
    loop i b = loop (i - 1) (b <> singleBS)
Packit 4b2029
Packit 4b2029
oneBSBuilderRight :: BS.Builder
Packit 4b2029
oneBSBuilderRight =
Packit 4b2029
    loop count mempty
Packit 4b2029
  where
Packit 4b2029
    loop 0 b = b
Packit 4b2029
    loop i b = loop (i - 1) (b <> singleBS)
Packit 4b2029
Packit 4b2029
builderBSSource :: Monad m => Source m BS.Builder
Packit 4b2029
builderBSSource = CL.replicate count singleBS
Packit 4b2029
Packit 4b2029
main :: IO ()
Packit 4b2029
main = defaultMain
Packit 4b2029
    [ bench "conduit, strict, safe" $ whnfIO $
Packit 4b2029
        builderSource $$ builderToByteString =$ CL.sinkNull
Packit 4b2029
    , bench "conduit, strict, unsafe" $ whnfIO $
Packit 4b2029
        builderSource $$ unsafeBuilderToByteString (allocBuffer defaultChunkSize) =$ CL.sinkNull
Packit 4b2029
Packit 4b2029
    , bench "one builder, left" $ nf toLazyByteString oneBuilderLeft
Packit 4b2029
    , bench "one builder, right" $ nf toLazyByteString oneBuilderRight
Packit 4b2029
    , bench "conduit, lazy" $ flip nf builderSource $ \src ->
Packit 4b2029
        toLazyByteString $ runIdentity $ src $$ CL.fold (<>) mempty
Packit 4b2029
Packit 4b2029
    , bench "one bs builder, left" $ nf BS.toLazyByteString oneBSBuilderLeft
Packit 4b2029
    , bench "one bs builder, right" $ nf BS.toLazyByteString oneBSBuilderRight
Packit 4b2029
    , bench "conduit BS, lazy" $ flip nf builderBSSource $ \src ->
Packit 4b2029
        BS.toLazyByteString $ runIdentity $ src $$ CL.fold (<>) mempty
Packit 4b2029
    ]