{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE BangPatterns #-}
import Text.Megaparsec
import Replace.Megaparsec
import Criterion.Main
import Criterion.Types
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Builder as B.Builder
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import Data.Void
fooStringM :: String
fooStringM = take 1000000 $ cycle " foo" -- a million bytes of foos
fooString10K :: String
fooString10K = take 10000 fooStringM
fooString100K :: String
fooString100K = take 100000 fooStringM
fooByteStringM :: B.ByteString
fooByteStringM = BL.toStrict fooByteStringLM
fooByteString10K :: B.ByteString
fooByteString10K = B.take 10000 fooByteStringM
fooByteString100K :: B.ByteString
fooByteString100K = B.take 100000 fooByteStringM
fooByteStringLM :: BL.ByteString
fooByteStringLM = B.Builder.toLazyByteString $ B.Builder.string8 fooStringM
fooByteStringL10K :: BL.ByteString
fooByteStringL10K = BL.take 10000 fooByteStringLM
fooByteStringL100K :: BL.ByteString
fooByteStringL100K = BL.take 100000 fooByteStringLM
fooTextM :: T.Text
fooTextM = T.pack fooStringM
fooText10K :: T.Text
fooText10K = T.take 10000 fooTextM
fooText100K :: T.Text
fooText100K = T.take 100000 fooTextM
fooTextLM :: TL.Text
fooTextLM = TL.pack fooStringM
fooTextL10K :: TL.Text
fooTextL10K = TL.take 10000 fooTextLM
fooTextL100K :: TL.Text
fooTextL100K = TL.take 100000 fooTextLM
main :: IO ()
main = defaultMainWith (defaultConfig
{ reportFile = Just "criterion-report.html"
, resamples = 100
})
[ bgroup "String"
[ bench "sepCap 10,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void String String)))
fooString10K
, bench "streamEdit 10,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void String String) (const "bar"))
fooString10K
, bench "sepCap 100,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void String String)))
fooString100K
, bench "streamEdit 100,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void String String) (const "bar"))
fooString100K
, bench "sepCap 1,000,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void String String)))
fooStringM
, bench "streamEdit 1,000,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void String String) (const "bar"))
fooStringM
]
, bgroup "ByteString.Strict"
[ bench "sepCap 10,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void B.ByteString B.ByteString)))
fooByteString10K
, bench "streamEdit 10,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void B.ByteString B.ByteString) (const "bar"))
fooByteString10K
, bench "sepCap 100,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void B.ByteString B.ByteString)))
fooByteString100K
, bench "streamEdit 100,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void B.ByteString B.ByteString) (const "bar"))
fooByteString100K
, bench "sepCap 1,000,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void B.ByteString B.ByteString)))
fooByteStringM
, bench "streamEdit 1,000,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void B.ByteString B.ByteString) (const "bar"))
fooByteStringM
]
, bgroup "ByteString.Lazy"
[ bench "sepCap 10,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void BL.ByteString BL.ByteString)))
fooByteStringL10K
, bench "streamEdit 10,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void BL.ByteString BL.ByteString) (const "bar"))
fooByteStringL10K
, bench "sepCap 100,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void BL.ByteString BL.ByteString)))
fooByteStringL100K
, bench "streamEdit 100,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void BL.ByteString BL.ByteString) (const "bar"))
fooByteStringL100K
, bench "sepCap 1,000,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void BL.ByteString BL.ByteString)))
fooByteStringLM
, bench "streamEdit 1,000,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void BL.ByteString BL.ByteString) (const "bar"))
fooByteStringLM
]
, bgroup "Text.Strict"
[ bench "sepCap 10,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void T.Text T.Text)))
fooText10K
, bench "streamEdit 10,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void T.Text T.Text) (const "bar"))
fooText10K
, bench "sepCap 100,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void T.Text T.Text)))
fooText100K
, bench "streamEdit 100,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void T.Text T.Text) (const "bar"))
fooText100K
, bench "sepCap 1,000,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void T.Text T.Text)))
fooTextM
, bench "streamEdit 1,000,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void T.Text T.Text) (const "bar"))
fooTextM
]
, bgroup "Text.Lazy"
[ bench "sepCap 10,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void TL.Text TL.Text)))
fooTextL10K
, bench "streamEdit 10,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void TL.Text TL.Text) (const "bar"))
fooTextL10K
, bench "sepCap 100,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void TL.Text TL.Text)))
fooTextL100K
, bench "streamEdit 100,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void TL.Text TL.Text) (const "bar"))
fooTextL100K
, bench "sepCap 1,000,000" $ whnf
(parseMaybe (sepCap (chunk "foo" :: Parsec Void TL.Text TL.Text)))
fooTextLM
, bench "streamEdit 1,000,000" $ whnf
(streamEdit (chunk "foo" :: Parsec Void TL.Text TL.Text) (const "bar"))
fooTextLM
]
]