git.iko.soy/typeable/attoparsec
on master help sign in
Add a Text version of the headers benchmarks

--HG-- rename : benchmarks/Headers.hs => benchmarks/HeadersByteString.hs rename : benchmarks/Headers.hs => benchmarks/HeadersText.hs

commit5478e81ad8a5d6b852c3b3d8fb46074d565a6dda authorBryan O'Sullivan <bryano@fb.com> dateThu 8 May 2014, 22:17 (12 years ago) parent15e4090
5 files changed+59−9
attoparsec.cabal+2−1 benchmarks/Benchmarks.hs+6−3 benchmarks/Headers.hs → benchmarks/HeadersByteString.hs+2−4 benchmarks/HeadersText.hs+47 benchmarks/attoparsec-benchmarks.cabal+2−1
attoparsec.cabal+2−1
@@ -94,7 +94,8 @@ benchmark benchmarks
9494 ghc-options: -O2 -Wall
9595 main-is: Benchmarks.hs
9696 other-modules:
97− Headers
97+ HeadersByteString
98+ HeadersText
9899 Numbers
99100 build-depends:
100101 attoparsec,
benchmarks/Benchmarks.hs+6−3
@@ -9,7 +9,8 @@ import Data.Char (isAlpha)
99import Data.Word (Word32)
1010import Data.Word (Word8)
1111import Numbers (numbers)
12−import qualified Headers
12+import qualified HeadersByteString
13+import qualified HeadersText
1314import Text.Parsec.Text ()
1415import Text.Parsec.Text.Lazy ()
1516import qualified Data.Attoparsec.ByteString as AB
@@ -46,7 +47,8 @@ main = do
4647 !bl = BL.fromChunks . map BC.pack . chunksOf 4 $ s
4748 !t = T.pack s
4849 !tl = TL.fromChunks . map T.pack . chunksOf 4 $ s
49− headers <- Headers.headers
50+ headersBS <- HeadersByteString.headers
51+ headersT <- HeadersText.headers
5052 defaultMain [
5153 bgroup "many" [
5254 bgroup "attoparsec" [
@@ -84,7 +86,8 @@ main = do
8486 bench "short" $ nf (AB.parse quotedString) (BC.pack "abcdefghijk\"")
8587 , bench "long" $ nf (AB.parse quotedString) b
8688 ]
87− , headers
89+ , headersBS
90+ , headersT
8891 , numbers
8992 ]
9093
benchmarks/Headers.hs → benchmarks/HeadersByteString.hsrenamed+2−4
@@ -1,12 +1,10 @@
11{-# LANGUAGE OverloadedStrings #-}
22{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
3−module Headers (headers) where
3+module HeadersByteString (headers) where
44
55import Control.Applicative
66import Criterion.Main (bench, bgroup, nf)
77import Criterion.Types (Benchmark)
8−import Text.Parsec.Text ()
9−import Text.Parsec.Text.Lazy ()
108import qualified Data.Attoparsec.ByteString.Char8 as B
119import qualified Data.ByteString.Char8 as B
1210
@@ -42,7 +40,7 @@ headers :: IO Benchmark
4240headers = do
4341 req <- B.readFile "http-request.txt"
4442 resp <- B.readFile "http-response.txt"
45− return $ bgroup "headers" [
43+ return $ bgroup "headersBS" [
4644 bench "request" $ nf (B.parseOnly request) req
4745 , bench "response" $ nf (B.parseOnly response) resp
4846 ]
benchmarks/HeadersText.hsnew file+47
@@ -0,0 +1,47 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
3+module HeadersText (headers) where
4+
5+import Control.Applicative
6+import Criterion.Main (bench, bgroup, nf)
7+import Criterion.Types (Benchmark)
8+import Data.Char (isSpace)
9+import qualified Data.Attoparsec.Text as T
10+import qualified Data.Text.IO as T
11+
12+header = do
13+ name <- T.takeWhile1 (T.inClass "a-zA-Z0-9_-") <* T.char ':' <* T.skipSpace
14+ body <- (:) <$> bodyLine <*> many (T.takeWhile1 isSpace *> bodyLine)
15+ return (name, body)
16+
17+bodyLine = T.takeTill (\c -> c == '\r' || c == '\n') <* T.endOfLine
18+
19+requestLine =
20+ (,,) <$>
21+ (method <* T.skipSpace) <*>
22+ (T.takeTill isSpace <* T.skipSpace) <*>
23+ httpVersion
24+ where method = "GET" <|> "POST"
25+
26+httpVersion = "HTTP/" *> ((,) <$> (int <* T.char '.') <*> int)
27+
28+responseLine = (,,) <$>
29+ (httpVersion <* T.skipSpace) <*>
30+ (int <* T.skipSpace) <*>
31+ bodyLine
32+
33+int :: T.Parser Int
34+int = T.decimal
35+
36+request = (,) <$> (requestLine <* T.endOfLine) <*> many header
37+
38+response = (,) <$> responseLine <*> many header
39+
40+headers :: IO Benchmark
41+headers = do
42+ req <- T.readFile "http-request.txt"
43+ resp <- T.readFile "http-response.txt"
44+ return $ bgroup "headersT" [
45+ bench "request" $ nf (T.parseOnly request) req
46+ , bench "response" $ nf (T.parseOnly response) resp
47+ ]
benchmarks/attoparsec-benchmarks.cabal+2−1
@@ -9,7 +9,8 @@ build-type: Simple
99executable attoparsec-benchmarks
1010 main-is: Benchmarks.hs
1111 other-modules:
12− Headers
12+ HeadersByteString
13+ HeadersText
1314 Numbers
1415 hs-source-dirs: .. .
1516 ghc-options: -O2 -Wall