@@ -1,18 +1,23 @@
11{-# LANGUAGE BangPatterns #-}
22
33import Control.Applicative
4+import Control.DeepSeq (NFData(rnf))
45import Criterion.Main (bench, bgroup, defaultMain, nf, whnf)
6+import Data.ByteString.Internal (ByteString(..))
57import Data.Char
8+import Text.Parsec.Text ()
9+import Text.Parsec.Text.Lazy ()
610import qualified Data.Attoparsec.ByteString as AB
711import qualified Data.Attoparsec.ByteString.Char8 as AC
12+import qualified Data.Attoparsec.ByteString.Lazy as ABL
813import qualified Data.Attoparsec.Text as AT
14+import qualified Data.Attoparsec.Text.Lazy as ATL
915import qualified Data.ByteString as B
1016import qualified Data.ByteString.Char8 as BC
17+import qualified Data.ByteString.Lazy as BL
1118import qualified Data.Text as T
19+import qualified Data.Text.Lazy as TL
1220import qualified Text.Parsec as P
13−import qualified Text.Parsec.Text as P
14−import Control.DeepSeq (NFData(rnf))
15−import Data.ByteString.Internal (ByteString(..))
1621
1722instance NFData ByteString where
1823 rnf (PS _ _ _) = ()
@@ -20,20 +25,43 @@ instance NFData ByteString where
2025instance NFData P.ParseError where
2126 rnf = rnf . show
2227
28+chunksOf :: Int -> [a] -> [[a]]
29+chunksOf k = go
30+ where go xs = case splitAt k xs of
31+ ([],_) -> []
32+ (y, ys) -> y : go ys
33+
34+fromLazy :: BL.ByteString -> B.ByteString
35+fromLazy = B.concat . BL.toChunks
36+
2337main = do
2438 let s = ['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9']
2539 !b = BC.pack s
40+ !bl = BL.fromChunks . map BC.pack . chunksOf 4 $ s
2641 !t = T.pack s
42+ !tl = TL.fromChunks . map T.pack . chunksOf 4 $ s
43+ s1 = take 1024 $ cycle ['a'..'z']
44+ !b1 = BC.pack s1
45+ !t1 = T.pack s1
46+ !bl1 = BL.fromChunks . map BC.pack . chunksOf 4 $ s1
2747 defaultMain [
28− bgroup "comparison" [
29− bgroup "parsec-vs-atto" [
30− bench "attoparsec B" $ whnf (AB.parse (many (AC.satisfy AC.isAlpha_ascii))) b
31− , bench "attoparsec T" $ whnf (AT.parse (many (AT.satisfy AC.isAlpha_ascii))) t
32− , bench "parsec B" $ whnf (P.parse (many (P.satisfy AC.isAlpha_ascii)) "") b
33− , bench "parsec S" $ whnf (P.parse (many (P.satisfy AC.isAlpha_ascii)) "") s
34− , bench "parsec T" $ whnf (P.parse (many (P.satisfy AC.isAlpha_ascii)) "") t
48+ bgroup "many" [
49+ bgroup "attoparsec" [
50+ bench "B" $ whnf (AB.parse (many (AC.satisfy AC.isAlpha_ascii))) b
51+ , bench "BL" $ whnf (ABL.parse (many (AC.satisfy AC.isAlpha_ascii))) bl
52+ , bench "T" $ whnf (AT.parse (many (AT.satisfy AC.isAlpha_ascii))) t
53+ , bench "TL" $ whnf (ATL.parse (many (AT.satisfy AC.isAlpha_ascii))) tl
3554 ]
36− , bgroup "many-vs-takeWhile" [
55+ , bgroup "parsec" [
56+ bench "S" $ whnf (P.parse (many (P.satisfy AC.isAlpha_ascii)) "") s
57+ , bench "B" $ whnf (P.parse (many (P.satisfy AC.isAlpha_ascii)) "") b
58+ , bench "BL" $ whnf (P.parse (many (P.satisfy AC.isAlpha_ascii)) "") bl
59+ , bench "T" $ whnf (P.parse (many (P.satisfy AC.isAlpha_ascii)) "") t
60+ , bench "TL" $ whnf (P.parse (many (P.satisfy AC.isAlpha_ascii)) "") tl
61+ ]
62+ ]
63+ , bgroup "comparison" [
64+ bgroup "many-vs-takeWhile" [
3765 bench "many" $ whnf (AB.parse (many (AC.satisfy AC.isAlpha_ascii))) b
3866 , bench "takeWhile" $ whnf (AB.parse (AC.takeWhile AC.isAlpha_ascii)) b
3967 ]