packages feed

bytestring-tree-builder-0.2.1.1: benchmark/Main.hs

module Main where

import BasePrelude
import Control.DeepSeq
import Criterion.Main
import Data.ByteString (ByteString)
import qualified ByteString.TreeBuilder as A


main =
  defaultMain $
  map sampleGroup $
  [("Small Input", smallSample), ("Medium Input", mediumSample), ("Large Input", largeSample)]
    
sampleGroup :: (String, Sample) -> Benchmark
sampleGroup (title, sample) =
  bench title $ nf sample $
  (A.byteString, mappend, mempty, A.toByteString)

type Sample =
  forall a. (ByteString -> a, a -> a -> a, a, a -> ByteString) -> ByteString

{-# NOINLINE smallSample #-}
smallSample :: Sample
smallSample (fromByteString, (<>), mempty, toByteString) =
  toByteString $
    (fromByteString "hello" <> fromByteString "asdf") <>
    fromByteString "fsndfn" <>
    (fromByteString "dfgknfg" <> fromByteString "aaaaaa")

{-# NOINLINE mediumSample #-}
mediumSample :: Sample
mediumSample (fromByteString, (<>), mempty, toByteString) =
  toByteString $
  foldl' (<>) mempty $ replicate 1000 $
    (fromByteString "hello" <> fromByteString "asdf") <>
    fromByteString "fsndfn" <>
    (fromByteString "dfgknfg" <> fromByteString "aaaaaa")

{-# NOINLINE largeSample #-}
largeSample :: Sample
largeSample (fromByteString, (<>), mempty, toByteString) =
  toByteString $
  foldl' (<>) mempty $ replicate 100000 $
    (fromByteString "hello" <> fromByteString "asdf") <>
    fromByteString "fsndfn" <>
    (fromByteString "dfgknfg" <> fromByteString "aaaaaa")