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