{-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} -- ------------------------------------------------------------ module Main where import Control.DeepSeq import Criterion.Main import qualified Data.ByteString.Char8 as B import qualified Data.ByteString.Lazy.Char8 as BL import Data.String (IsString (..)) import qualified Data.Text as T import qualified Data.Text.Lazy as TL import Text.Regex.XMLSchema.Generic import Text.Regex.XMLSchema.Generic.StringLike -- import Debug.Trace -- ------------------------------------------------------------ type BS = B.ByteString type BL = BL.ByteString type Text = T.Text type TextL = TL.Text -- ------------------------------------------------------------ benchSTB :: String -> (forall s . (NFData s, StringLike s) => s -> [s]) -> (String, String -> [String]) -> String -> Benchmark benchSTB name fct ref inp = benchSTB' name fct ref $! mkInput inp benchSTB' :: String -> (forall s . (NFData s, StringLike s) => s -> [s]) -> (String, String -> [String]) -> (String, Text, TextL, BS, BL) -> Benchmark benchSTB' name fct (refName, ref) (s, t, tl, bs, bl) = bgroup name [ bench refName $ nf ref s , bench "String" $ nf fct s , bench "Text" $ nf fct t , bench "Text.Lazy" $ nf fct tl , bench "ByteString" $ nf fct bs , bench "ByteString.Lazy" $ nf fct bl ] mkInput :: String -> (String, Text, TextL, BS, BL) mkInput s = rnf t5 `seq` t5 where t5 = (s, fromString s, fromString s, fromString s, fromString s) words' :: StringLike s => s -> [s] words' inp = tokenize (fromString "\\w+") inp main :: IO () main = do defaultMain [ benchSTB "100,000-words" words' ("words", words) $ unwords (replicate 100000 "1234567890") ] -- ------------------------------------------------------------