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