1{-# LANGUAGE ScopedTypeVariables #-}
2
3import Gauge.Main
4import qualified Data.ByteString.Char8 as S
5import qualified Data.ByteString.Builder as BB
6import Data.Monoid
7import qualified Data.Streaming.ByteString.Builder as BB
8
9main :: IO ()
10main = defaultMain [ bgroup "Data.Streaming.ByteString.Builder.toByteStringIO"
11                            (benchmarks bIO b100_10000 b10000_100 b10000_10000)
12                   , bgroup "Data.ByteString.Builder.toLazyByteString"
13                            (benchmarks bLazy b100_10000 b10000_100 b10000_10000)
14                   ]
15  where
16    bIO = whnfIO . BB.toByteStringIO (const (return ()))
17    bLazy = nf BB.toLazyByteString
18    benchmarks run bld100_10000 bld10000_100 bld10000_10000 =
19        [ bench' run bld100_10000 100 10000
20        , bench' run bld10000_100 10000 100
21        , bench' run bld10000_10000 10000 10000
22        ]
23    bench' :: (b -> Benchmarkable) -> b -> Int -> Int -> Benchmark
24    bench' run bld' len reps = bench (show len ++ "/" ++ show reps) (run bld')
25    b100_10000 = bld BB.byteString 100 10000
26    b10000_100 = bld BB.byteString 10000 100
27    b10000_10000 = bld BB.byteString 10000 10000
28    bld :: Data.Monoid.Monoid a => (S.ByteString -> a) -> Int -> Int -> a
29    bld f len reps = mconcat (replicate reps (f (S.replicate len 'x')))
30