binary-parsers 0.2.0.0 → 0.2.1.0
raw patch · 7 files changed
+463/−313 lines, 7 filesdep +scannerPVP ok
version bump matches the API change (PVP)
Dependencies added: scanner
API changes (from Hackage documentation)
+ Data.Binary.Parser: infix 0 <?>
+ Data.Binary.Parser: parse :: Get a -> ByteString -> Decoder a
+ Data.Binary.Parser: parseDetail :: Get a -> ByteString -> Either (ByteString, ByteOffset, String) (ByteString, ByteOffset, a)
+ Data.Binary.Parser: parseDetailLazy :: Get a -> ByteString -> Either (ByteString, ByteOffset, String) (ByteString, ByteOffset, a)
Files
- ChangeLog.md +6/−0
- Data/Binary/Parser.hs +89/−8
- Data/Binary/Parser/Word8.hs +10/−4
- README.md +307/−298
- bench/Bench.hs +6/−0
- bench/HttpReq.hs +43/−2
- binary-parsers.cabal +2/−1
ChangeLog.md view
@@ -1,5 +1,11 @@ # Revision history for binary-parsec +## 0.2.1.0 -- 2016-09-21++* Add `parse`,`parseDetail`, `parseDetailLazy`.+* Reduce these running functions' overhead so that binary performs well on small getters now.+* Add scanner to benchmarks.+ ## 0.2.0.0 -- 2016-09-21 * Add `endOfLine` combinator.
Data/Binary/Parser.hs view
@@ -37,14 +37,21 @@ -- @ -- -- For fast byte set operations, please use <http://hackage.haskell.org/package/charset charset>--- package. If there's anything missing from this package please report!+-- package. --+-- It's recommanded to use 'parseOnly', 'parseDetail'... functions to run your parsers since these+-- functions are faster than binary's counter part by avoiding a small constant overhead.+-- Check 'parse' for detail.+-- module Data.Binary.Parser ( -- * Running parsers Parser , parseOnly , parseLazy+ , parseDetail+ , parseDetailLazy+ , parse -- * Combinators , (<?>) , endOfInput@@ -70,10 +77,12 @@ import Control.Applicative import Control.Monad import Data.Binary.Get+import qualified Data.Binary.Get.Internal as I import Data.Binary.Parser.Numeric import Data.Binary.Parser.Word8 import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as L+import qualified Data.ByteString.Lazy.Internal as L (ByteString(..)) -------------------------------------------------------------------------------- @@ -90,24 +99,96 @@ -- parseOnly :: Get a -> B.ByteString -> Either String a parseOnly g bs =- let d = runGetIncremental g- in case pushEndOfInput (pushChunk d bs) of+ case pushEndOfInput (parse g bs) of Fail _ _ err -> Left err Done _ _ a -> Right a- _ -> Left "parseOnly: impossible error!"+ _ -> error "parseOnly: impossible error!" {-# INLINE parseOnly #-} -- | Similar to 'parseOnly', but run a parser on lazy 'L.ByteString'. -- parseLazy :: Get a -> L.ByteString -> Either String a-parseLazy g lbs =- let d = runGetIncremental g- in case pushEndOfInput (pushChunks d lbs) of+parseLazy g (L.Chunk bs lbs) =+ case pushEndOfInput (pushChunks (parse g bs) lbs) of Fail _ _ err -> Left err Done _ _ a -> Right a- _ -> Left "parseOnly: impossible error!"+ _ -> error "parseOnly: impossible error!"+parseLazy g L.Empty =+ case pushEndOfInput (parse g B.empty) of+ Fail _ _ err -> Left err+ Done _ _ a -> Right a+ _ -> error "parseOnly: impossible error!" {-# INLINE parseLazy #-}++-- | Run a parser on 'B.ByteString'.+--+-- This function return full parsing results: the rest of input, stop offest and fail+-- message or parsing result.+--+-- /Since: 0.2.1.0/+--+parseDetail :: Get a+ -> B.ByteString+ -> Either (B.ByteString, ByteOffset, String) (B.ByteString, ByteOffset, a)+parseDetail g bs =+ case pushEndOfInput (parse g bs) of+ Fail rest offset err -> Left (rest, offset, err)+ Done rest offset a -> Right (rest, offset, a)+ _ -> error "parseOnly: impossible error!"+{-# INLINE parseDetail #-}++-- | Similar to 'parseDetail', but run a parser on lazy 'L.ByteString'.+--+-- /Since: 0.2.1.0/+--+parseDetailLazy :: Get a+ -> L.ByteString+ -> Either (B.ByteString, ByteOffset, String) (B.ByteString, ByteOffset, a)+parseDetailLazy g (L.Chunk bs lbs) =+ case pushEndOfInput (pushChunks (parse g bs) lbs) of+ Fail rest offset err -> Left (rest, offset, err)+ Done rest offset a -> Right (rest, offset, a)+ _ -> error "parseOnly: impossible error!"+parseDetailLazy g L.Empty =+ case pushEndOfInput (parse g B.empty) of+ Fail rest offset err -> Left (rest, offset, err)+ Done rest offset a -> Right (rest, offset, a)+ _ -> error "parseOnly: impossible error!"+{-# INLINE parseDetailLazy #-}++-- | Run a 'Get' monad. See 'Decoder' for what to do next, like providing+-- input, handling decoding errors and to get the output value.+--+-- This's faster than 'runGetIncremental' becuase it provides an initial chunk rather+-- than feeding 'B.empty' and waiting for chunks, this overhead is noticeable when you're+-- running small getters over short 'ByteString' s.+--+-- /Since: 0.2.1.0/+--+parse :: Get a -> B.ByteString -> Decoder a+parse g bs = calculateOffset (loop (I.runCont g bs I.Done)) (fromIntegral $ B.length bs)+ where+ calculateOffset r !acc = case r of+ I.Done inp a -> Done inp (acc - fromIntegral (B.length inp)) a+ I.Fail inp s -> Fail inp (acc - fromIntegral (B.length inp)) s+ I.Partial k -> Partial $ \ms -> case ms of+ Nothing -> calculateOffset (k Nothing) acc+ Just i -> calculateOffset (k ms) (acc + fromIntegral (B.length i))+ I.BytesRead unused k -> calculateOffset (k $! (acc - unused)) acc++ loop r = case r of+ I.Partial k -> I.Partial $ \ms -> case ms of Just _ -> loop (k ms)+ Nothing -> completeLoop (k ms)+ I.BytesRead n k -> I.BytesRead n (loop . k)+ I.Done _ _ -> r+ I.Fail _ _ -> r++ completeLoop r = case r of+ I.Partial k -> completeLoop (k Nothing)+ I.BytesRead n k -> I.BytesRead n (completeLoop . k)+ I.Fail _ _ -> r+ I.Done _ _ -> r --------------------------------------------------------------------------------
Data/Binary/Parser/Word8.hs view
@@ -214,11 +214,17 @@ string :: ByteString -> Get () string bs = do let l = B.length bs- ensureN l bs' <- get- if B.unsafeTake l bs' == bs- then put (B.unsafeDrop l bs')- else fail ("string not match: " ++ show bs)+ if l <= B.length bs' -- current chunk is enough+ then if B.unsafeTake l bs' == bs+ then put (B.unsafeDrop l bs')+ else fail "string"+ else do+ ensureN l+ bs'' <- get+ if B.unsafeTake l bs'' == bs+ then put (B.unsafeDrop l bs'')+ else fail "string" {-# INLINE string #-} -- | A stateful scanner. The predicate consumes and transforms a
README.md view
@@ -32,446 +32,455 @@ --------- ```+start benchmark http request parser benchmarking http-req/attoparsec-time 2.240 μs (2.216 μs .. 2.264 μs)- 0.998 R² (0.996 R² .. 0.999 R²)-mean 2.320 μs (2.251 μs .. 2.702 μs)-std dev 417.9 ns (60.72 ns .. 1.012 μs)-variance introduced by outliers: 96% (severely inflated)+time 2.234 μs (2.216 μs .. 2.252 μs)+ 0.999 R² (0.999 R² .. 1.000 R²)+mean 2.243 μs (2.227 μs .. 2.261 μs)+std dev 58.33 ns (45.77 ns .. 81.74 ns)+variance introduced by outliers: 32% (moderately inflated) benchmarking http-req/binary-parsers-time 1.552 μs (1.533 μs .. 1.577 μs)- 0.980 R² (0.942 R² .. 0.999 R²)-mean 1.673 μs (1.549 μs .. 1.984 μs)-std dev 583.2 ns (53.70 ns .. 1.115 μs)-variance introduced by outliers: 99% (severely inflated)+time 1.355 μs (1.344 μs .. 1.368 μs)+ 0.999 R² (0.999 R² .. 1.000 R²)+mean 1.367 μs (1.354 μs .. 1.379 μs)+std dev 42.42 ns (34.69 ns .. 54.51 ns)+variance introduced by outliers: 42% (moderately inflated) +benchmarking http-req/scanner+time 1.440 μs (1.346 μs .. 1.652 μs)+ 0.928 R² (0.848 R² .. 0.999 R²)+mean 1.392 μs (1.345 μs .. 1.528 μs)+std dev 268.6 ns (40.18 ns .. 516.8 ns)+variance introduced by outliers: 97% (severely inflated)+ benchmarking http-req/warp-time 903.0 ns (894.7 ns .. 911.2 ns)- 0.999 R² (0.998 R² .. 0.999 R²)-mean 906.6 ns (896.2 ns .. 918.4 ns)-std dev 36.38 ns (28.49 ns .. 51.58 ns)-variance introduced by outliers: 56% (severely inflated)+time 921.0 ns (913.2 ns .. 928.5 ns)+ 0.999 R² (0.999 R² .. 1.000 R²)+mean 923.5 ns (916.3 ns .. 931.3 ns)+std dev 25.51 ns (21.12 ns .. 31.75 ns)+variance introduced by outliers: 38% (moderately inflated) +start benchmark JSON parser benchmarking attoparsec/buffer-builder-time 4.025 ms (3.965 ms .. 4.097 ms)- 0.998 R² (0.997 R² .. 0.999 R²)-mean 4.180 ms (4.133 ms .. 4.242 ms)-std dev 164.2 μs (126.7 μs .. 204.4 μs)-variance introduced by outliers: 22% (moderately inflated)+time 4.152 ms (4.088 ms .. 4.201 ms)+ 0.999 R² (0.998 R² .. 0.999 R²)+mean 4.256 ms (4.221 ms .. 4.302 ms)+std dev 128.6 μs (97.90 μs .. 190.0 μs)+variance introduced by outliers: 13% (moderately inflated) benchmarking binary-parser/buffer-builder-time 3.509 ms (3.462 ms .. 3.552 ms)- 0.998 R² (0.997 R² .. 0.999 R²)-mean 3.585 ms (3.550 ms .. 3.646 ms)-std dev 151.8 μs (85.69 μs .. 273.2 μs)-variance introduced by outliers: 24% (moderately inflated)+time 3.768 ms (3.663 ms .. 3.910 ms)+ 0.993 R² (0.986 R² .. 0.998 R²)+mean 3.815 ms (3.765 ms .. 3.877 ms)+std dev 175.5 μs (140.6 μs .. 253.8 μs)+variance introduced by outliers: 27% (moderately inflated) benchmarking attoparsec/lazy-bytestring/buffer-builder-time 4.360 ms (4.192 ms .. 4.641 ms)- 0.970 R² (0.936 R² .. 0.996 R²)-mean 4.355 ms (4.254 ms .. 4.546 ms)-std dev 408.3 μs (258.9 μs .. 687.3 μs)-variance introduced by outliers: 59% (severely inflated)+time 4.117 ms (4.037 ms .. 4.186 ms)+ 0.997 R² (0.994 R² .. 0.999 R²)+mean 4.328 ms (4.151 ms .. 5.153 ms)+std dev 1.013 ms (102.4 μs .. 2.296 ms)+variance introduced by outliers: 90% (severely inflated) benchmarking binary-parser/lazy-bytestring/buffer-builder-time 3.541 ms (3.476 ms .. 3.602 ms)- 0.998 R² (0.997 R² .. 0.999 R²)-mean 3.560 ms (3.525 ms .. 3.607 ms)-std dev 127.2 μs (98.15 μs .. 170.4 μs)-variance introduced by outliers: 18% (moderately inflated)+time 4.146 ms (3.765 ms .. 4.911 ms)+ 0.763 R² (0.649 R² .. 0.975 R²)+mean 4.158 ms (3.859 ms .. 4.783 ms)+std dev 1.300 ms (791.0 μs .. 1.930 ms)+variance introduced by outliers: 95% (severely inflated) benchmarking attoparsec/dates-fract-time 4.266 μs (4.112 μs .. 4.506 μs)- 0.979 R² (0.945 R² .. 0.999 R²)-mean 4.184 μs (4.099 μs .. 4.485 μs)-std dev 495.3 ns (141.5 ns .. 1.023 μs)-variance introduced by outliers: 91% (severely inflated)+time 3.990 μs (3.934 μs .. 4.064 μs)+ 0.958 R² (0.869 R² .. 0.998 R²)+mean 4.678 μs (4.105 μs .. 6.598 μs)+std dev 3.240 μs (890.6 ns .. 6.569 μs)+variance introduced by outliers: 99% (severely inflated) benchmarking binary-parser/dates-fract-time 3.179 μs (3.151 μs .. 3.206 μs)- 0.999 R² (0.999 R² .. 0.999 R²)-mean 3.192 μs (3.161 μs .. 3.224 μs)-std dev 106.0 ns (88.88 ns .. 130.2 ns)-variance introduced by outliers: 43% (moderately inflated)+time 3.073 μs (2.993 μs .. 3.168 μs)+ 0.993 R² (0.987 R² .. 0.999 R²)+mean 3.130 μs (3.030 μs .. 3.534 μs)+std dev 582.4 ns (196.7 ns .. 1.256 μs)+variance introduced by outliers: 97% (severely inflated) benchmarking attoparsec/lazy-bytestring/dates-fract-time 4.176 μs (4.140 μs .. 4.213 μs)- 0.999 R² (0.999 R² .. 0.999 R²)-mean 4.158 μs (4.115 μs .. 4.194 μs)-std dev 126.3 ns (102.9 ns .. 156.6 ns)-variance introduced by outliers: 38% (moderately inflated)+time 4.162 μs (4.079 μs .. 4.301 μs)+ 0.936 R² (0.818 R² .. 0.998 R²)+mean 4.485 μs (4.118 μs .. 5.618 μs)+std dev 2.185 μs (241.3 ns .. 4.168 μs)+variance introduced by outliers: 99% (severely inflated) benchmarking binary-parser/lazy-bytestring/dates-fract-time 3.243 μs (3.199 μs .. 3.290 μs)- 0.999 R² (0.998 R² .. 0.999 R²)-mean 3.225 μs (3.193 μs .. 3.259 μs)-std dev 108.6 ns (90.97 ns .. 130.0 ns)-variance introduced by outliers: 44% (moderately inflated)+time 3.038 μs (3.017 μs .. 3.061 μs)+ 0.999 R² (0.999 R² .. 1.000 R²)+mean 3.042 μs (3.017 μs .. 3.067 μs)+std dev 86.40 ns (72.15 ns .. 110.5 ns)+variance introduced by outliers: 36% (moderately inflated) benchmarking attoparsec/dates-time 3.912 μs (3.866 μs .. 3.962 μs)- 0.999 R² (0.998 R² .. 0.999 R²)-mean 3.897 μs (3.858 μs .. 3.940 μs)-std dev 134.6 ns (115.1 ns .. 161.1 ns)-variance introduced by outliers: 44% (moderately inflated)+time 3.890 μs (3.852 μs .. 3.927 μs)+ 0.999 R² (0.999 R² .. 0.999 R²)+mean 3.911 μs (3.869 μs .. 3.955 μs)+std dev 147.6 ns (125.4 ns .. 185.8 ns)+variance introduced by outliers: 49% (moderately inflated) benchmarking binary-parser/dates-time 3.049 μs (3.030 μs .. 3.068 μs)- 0.999 R² (0.999 R² .. 1.000 R²)-mean 3.044 μs (3.017 μs .. 3.083 μs)-std dev 100.4 ns (78.69 ns .. 158.1 ns)-variance introduced by outliers: 43% (moderately inflated)+time 2.962 μs (2.930 μs .. 2.993 μs)+ 0.999 R² (0.999 R² .. 0.999 R²)+mean 2.971 μs (2.940 μs .. 3.007 μs)+std dev 115.6 ns (92.31 ns .. 143.5 ns)+variance introduced by outliers: 51% (severely inflated) benchmarking attoparsec/lazy-bytestring/dates-time 4.063 μs (3.949 μs .. 4.309 μs)- 0.971 R² (0.914 R² .. 0.999 R²)-mean 4.086 μs (3.967 μs .. 4.648 μs)-std dev 698.0 ns (100.7 ns .. 1.573 μs)-variance introduced by outliers: 95% (severely inflated)+time 3.950 μs (3.891 μs .. 4.010 μs)+ 0.998 R² (0.997 R² .. 0.999 R²)+mean 3.954 μs (3.905 μs .. 4.009 μs)+std dev 171.8 ns (145.4 ns .. 203.0 ns)+variance introduced by outliers: 56% (severely inflated) benchmarking binary-parser/lazy-bytestring/dates-time 3.119 μs (3.090 μs .. 3.144 μs)+time 2.961 μs (2.935 μs .. 2.987 μs) 0.999 R² (0.999 R² .. 1.000 R²)-mean 3.136 μs (3.104 μs .. 3.177 μs)-std dev 117.7 ns (89.99 ns .. 159.5 ns)-variance introduced by outliers: 50% (moderately inflated)+mean 2.960 μs (2.936 μs .. 2.993 μs)+std dev 93.80 ns (72.84 ns .. 145.9 ns)+variance introduced by outliers: 41% (moderately inflated) benchmarking attoparsec/example-time 72.13 μs (70.94 μs .. 73.31 μs)+time 74.67 μs (73.57 μs .. 75.75 μs) 0.998 R² (0.998 R² .. 0.999 R²)-mean 72.33 μs (71.62 μs .. 73.14 μs)-std dev 2.436 μs (2.064 μs .. 2.884 μs)-variance introduced by outliers: 34% (moderately inflated)+mean 74.86 μs (74.11 μs .. 75.73 μs)+std dev 2.666 μs (2.239 μs .. 3.379 μs)+variance introduced by outliers: 37% (moderately inflated) benchmarking binary-parser/example-time 56.33 μs (55.34 μs .. 57.30 μs)- 0.998 R² (0.997 R² .. 0.999 R²)-mean 56.49 μs (55.79 μs .. 57.23 μs)-std dev 2.350 μs (2.001 μs .. 2.837 μs)-variance introduced by outliers: 45% (moderately inflated)+time 57.40 μs (56.92 μs .. 57.90 μs)+ 0.999 R² (0.999 R² .. 1.000 R²)+mean 57.63 μs (57.19 μs .. 58.12 μs)+std dev 1.585 μs (1.240 μs .. 2.004 μs)+variance introduced by outliers: 26% (moderately inflated) benchmarking attoparsec/lazy-bytestring/example-time 77.40 μs (76.73 μs .. 78.14 μs)+time 78.02 μs (77.31 μs .. 78.81 μs) 0.999 R² (0.998 R² .. 0.999 R²)-mean 76.89 μs (76.17 μs .. 77.52 μs)-std dev 2.279 μs (1.928 μs .. 2.805 μs)-variance introduced by outliers: 28% (moderately inflated)+mean 78.12 μs (77.35 μs .. 78.97 μs)+std dev 2.733 μs (2.141 μs .. 3.506 μs)+variance introduced by outliers: 35% (moderately inflated) benchmarking binary-parser/lazy-bytestring/example-time 55.60 μs (54.87 μs .. 56.35 μs)- 0.999 R² (0.998 R² .. 0.999 R²)-mean 55.96 μs (55.38 μs .. 56.61 μs)-std dev 2.079 μs (1.695 μs .. 2.696 μs)-variance introduced by outliers: 40% (moderately inflated)+time 62.15 μs (57.00 μs .. 72.25 μs)+ 0.931 R² (0.874 R² .. 0.999 R²)+mean 58.85 μs (57.24 μs .. 63.61 μs)+std dev 8.903 μs (2.232 μs .. 18.31 μs)+variance introduced by outliers: 92% (severely inflated) benchmarking attoparsec/geometry-time 3.276 ms (3.193 ms .. 3.358 ms)- 0.956 R² (0.864 R² .. 0.999 R²)-mean 3.469 ms (3.348 ms .. 3.945 ms)-std dev 643.7 μs (126.3 μs .. 1.290 ms)-variance introduced by outliers: 86% (severely inflated)+time 3.216 ms (3.166 ms .. 3.266 ms)+ 0.995 R² (0.986 R² .. 0.999 R²)+mean 3.293 ms (3.235 ms .. 3.410 ms)+std dev 258.3 μs (113.4 μs .. 481.1 μs)+variance introduced by outliers: 53% (severely inflated) benchmarking binary-parser/geometry-time 2.391 ms (2.365 ms .. 2.414 ms)- 0.998 R² (0.997 R² .. 0.999 R²)-mean 2.400 ms (2.382 ms .. 2.422 ms)-std dev 67.04 μs (55.68 μs .. 89.92 μs)-variance introduced by outliers: 14% (moderately inflated)+time 2.466 ms (2.418 ms .. 2.523 ms)+ 0.996 R² (0.994 R² .. 0.998 R²)+mean 2.527 ms (2.498 ms .. 2.567 ms)+std dev 114.9 μs (92.96 μs .. 146.6 μs)+variance introduced by outliers: 29% (moderately inflated) benchmarking attoparsec/lazy-bytestring/geometry-time 3.310 ms (3.268 ms .. 3.358 ms)+time 3.296 ms (3.240 ms .. 3.357 ms) 0.998 R² (0.997 R² .. 0.999 R²)-mean 3.331 ms (3.300 ms .. 3.365 ms)-std dev 98.28 μs (81.46 μs .. 121.5 μs)+mean 3.282 ms (3.252 ms .. 3.310 ms)+std dev 94.60 μs (78.03 μs .. 117.8 μs) variance introduced by outliers: 14% (moderately inflated) benchmarking binary-parser/lazy-bytestring/geometry-time 2.367 ms (2.340 ms .. 2.403 ms)- 0.998 R² (0.997 R² .. 0.999 R²)-mean 2.381 ms (2.361 ms .. 2.403 ms)-std dev 74.51 μs (61.89 μs .. 90.25 μs)-variance introduced by outliers: 18% (moderately inflated)+time 2.462 ms (2.424 ms .. 2.500 ms)+ 0.998 R² (0.996 R² .. 0.999 R²)+mean 2.454 ms (2.431 ms .. 2.483 ms)+std dev 90.13 μs (74.45 μs .. 119.6 μs)+variance introduced by outliers: 22% (moderately inflated) benchmarking attoparsec/integers-time 288.9 μs (286.7 μs .. 290.7 μs)- 0.999 R² (0.999 R² .. 0.999 R²)-mean 290.2 μs (287.6 μs .. 293.5 μs)-std dev 9.951 μs (7.963 μs .. 12.97 μs)-variance introduced by outliers: 29% (moderately inflated)+time 303.8 μs (301.0 μs .. 306.8 μs)+ 0.999 R² (0.998 R² .. 0.999 R²)+mean 304.3 μs (301.6 μs .. 307.0 μs)+std dev 8.985 μs (7.176 μs .. 11.49 μs)+variance introduced by outliers: 23% (moderately inflated) benchmarking binary-parser/integers-time 160.9 μs (159.3 μs .. 162.5 μs)- 0.999 R² (0.999 R² .. 1.000 R²)-mean 159.9 μs (158.6 μs .. 161.4 μs)-std dev 4.600 μs (3.712 μs .. 5.996 μs)-variance introduced by outliers: 25% (moderately inflated)+time 222.4 μs (206.7 μs .. 245.6 μs)+ 0.956 R² (0.907 R² .. 0.998 R²)+mean 210.2 μs (205.4 μs .. 226.7 μs)+std dev 26.99 μs (8.189 μs .. 54.58 μs)+variance introduced by outliers: 86% (severely inflated) benchmarking attoparsec/lazy-bytestring/integers-time 291.4 μs (284.9 μs .. 297.8 μs)- 0.981 R² (0.947 R² .. 0.998 R²)-mean 333.5 μs (298.2 μs .. 439.6 μs)-std dev 168.6 μs (12.37 μs .. 334.8 μs)-variance introduced by outliers: 99% (severely inflated)+time 302.1 μs (298.8 μs .. 305.5 μs)+ 0.999 R² (0.999 R² .. 0.999 R²)+mean 304.8 μs (302.9 μs .. 307.2 μs)+std dev 7.239 μs (5.903 μs .. 8.904 μs)+variance introduced by outliers: 16% (moderately inflated) benchmarking binary-parser/lazy-bytestring/integers-time 162.9 μs (160.7 μs .. 165.5 μs)+time 206.4 μs (203.0 μs .. 210.2 μs) 0.998 R² (0.998 R² .. 0.999 R²)-mean 163.0 μs (161.3 μs .. 165.4 μs)-std dev 6.593 μs (5.433 μs .. 8.570 μs)-variance introduced by outliers: 40% (moderately inflated)+mean 204.7 μs (203.1 μs .. 206.3 μs)+std dev 5.477 μs (4.497 μs .. 6.974 μs)+variance introduced by outliers: 21% (moderately inflated) benchmarking attoparsec/jp10-time 482.6 μs (478.1 μs .. 488.4 μs)- 0.997 R² (0.994 R² .. 0.999 R²)-mean 493.1 μs (487.6 μs .. 501.3 μs)-std dev 23.78 μs (16.67 μs .. 38.12 μs)-variance introduced by outliers: 42% (moderately inflated)+time 489.4 μs (484.9 μs .. 495.0 μs)+ 0.999 R² (0.998 R² .. 0.999 R²)+mean 490.0 μs (486.2 μs .. 494.0 μs)+std dev 13.70 μs (10.93 μs .. 18.78 μs)+variance introduced by outliers: 20% (moderately inflated) benchmarking binary-parser/jp10-time 469.5 μs (464.7 μs .. 474.2 μs)- 0.999 R² (0.999 R² .. 0.999 R²)-mean 473.4 μs (469.2 μs .. 477.6 μs)-std dev 13.50 μs (10.90 μs .. 17.13 μs)-variance introduced by outliers: 20% (moderately inflated)+time 458.2 μs (455.1 μs .. 461.6 μs)+ 0.999 R² (0.998 R² .. 0.999 R²)+mean 463.4 μs (459.1 μs .. 468.5 μs)+std dev 15.32 μs (12.59 μs .. 19.01 μs)+variance introduced by outliers: 26% (moderately inflated) benchmarking attoparsec/lazy-bytestring/jp10-time 484.6 μs (478.4 μs .. 489.7 μs)+time 488.0 μs (480.6 μs .. 493.8 μs) 0.999 R² (0.998 R² .. 0.999 R²)-mean 486.6 μs (482.1 μs .. 493.4 μs)-std dev 18.89 μs (13.73 μs .. 27.58 μs)-variance introduced by outliers: 33% (moderately inflated)+mean 485.8 μs (481.6 μs .. 490.0 μs)+std dev 14.50 μs (11.70 μs .. 19.83 μs)+variance introduced by outliers: 22% (moderately inflated) benchmarking binary-parser/lazy-bytestring/jp10-time 467.7 μs (461.8 μs .. 472.8 μs)- 0.999 R² (0.998 R² .. 0.999 R²)-mean 467.9 μs (463.6 μs .. 472.4 μs)-std dev 15.49 μs (13.18 μs .. 18.54 μs)-variance introduced by outliers: 26% (moderately inflated)+time 478.6 μs (453.6 μs .. 535.7 μs)+ 0.932 R² (0.837 R² .. 0.999 R²)+mean 473.8 μs (458.7 μs .. 527.8 μs)+std dev 84.24 μs (12.21 μs .. 172.8 μs)+variance introduced by outliers: 91% (severely inflated) benchmarking attoparsec/jp100-time 2.971 ms (2.942 ms .. 3.005 ms)- 0.999 R² (0.998 R² .. 0.999 R²)-mean 3.022 ms (2.997 ms .. 3.051 ms)-std dev 89.08 μs (74.72 μs .. 111.6 μs)-variance introduced by outliers: 15% (moderately inflated)+time 2.961 ms (2.913 ms .. 3.010 ms)+ 0.998 R² (0.997 R² .. 0.999 R²)+mean 3.009 ms (2.985 ms .. 3.035 ms)+std dev 78.61 μs (67.01 μs .. 95.10 μs)+variance introduced by outliers: 11% (moderately inflated) benchmarking binary-parser/jp100-time 2.607 ms (2.564 ms .. 2.652 ms)- 0.998 R² (0.997 R² .. 0.999 R²)-mean 2.606 ms (2.579 ms .. 2.630 ms)-std dev 79.86 μs (67.90 μs .. 97.65 μs)-variance introduced by outliers: 16% (moderately inflated)+time 2.735 ms (2.703 ms .. 2.771 ms)+ 0.999 R² (0.998 R² .. 0.999 R²)+mean 2.731 ms (2.707 ms .. 2.762 ms)+std dev 91.60 μs (70.79 μs .. 137.6 μs)+variance introduced by outliers: 18% (moderately inflated) benchmarking attoparsec/lazy-bytestring/jp100-time 3.028 ms (2.986 ms .. 3.065 ms)+time 3.005 ms (2.964 ms .. 3.051 ms) 0.998 R² (0.996 R² .. 0.999 R²)-mean 3.073 ms (3.046 ms .. 3.109 ms)-std dev 102.4 μs (80.67 μs .. 139.1 μs)-variance introduced by outliers: 17% (moderately inflated)+mean 3.095 ms (3.065 ms .. 3.128 ms)+std dev 108.5 μs (88.97 μs .. 134.4 μs)+variance introduced by outliers: 19% (moderately inflated) benchmarking binary-parser/lazy-bytestring/jp100-time 2.617 ms (2.568 ms .. 2.658 ms)+time 2.760 ms (2.724 ms .. 2.797 ms) 0.998 R² (0.997 R² .. 0.999 R²)-mean 2.588 ms (2.560 ms .. 2.619 ms)-std dev 94.41 μs (78.93 μs .. 115.4 μs)-variance introduced by outliers: 20% (moderately inflated)+mean 2.747 ms (2.718 ms .. 2.776 ms)+std dev 93.90 μs (71.25 μs .. 122.5 μs)+variance introduced by outliers: 19% (moderately inflated) benchmarking attoparsec/jp50-time 1.575 ms (1.558 ms .. 1.591 ms)- 0.998 R² (0.998 R² .. 0.999 R²)-mean 1.578 ms (1.564 ms .. 1.594 ms)-std dev 52.98 μs (44.55 μs .. 63.68 μs)-variance introduced by outliers: 21% (moderately inflated)+time 1.618 ms (1.591 ms .. 1.648 ms)+ 0.998 R² (0.997 R² .. 0.999 R²)+mean 1.616 ms (1.602 ms .. 1.633 ms)+std dev 50.98 μs (40.28 μs .. 69.45 μs)+variance introduced by outliers: 19% (moderately inflated) benchmarking binary-parser/jp50-time 1.541 ms (1.434 ms .. 1.744 ms)- 0.957 R² (0.923 R² .. 0.999 R²)-mean 1.457 ms (1.433 ms .. 1.555 ms)-std dev 130.2 μs (39.54 μs .. 284.7 μs)-variance introduced by outliers: 65% (severely inflated)+time 1.518 ms (1.459 ms .. 1.674 ms)+ 0.863 R² (0.672 R² .. 0.999 R²)+mean 1.533 ms (1.466 ms .. 1.801 ms)+std dev 421.6 μs (44.69 μs .. 893.1 μs)+variance introduced by outliers: 95% (severely inflated) benchmarking attoparsec/lazy-bytestring/jp50-time 1.597 ms (1.574 ms .. 1.625 ms)- 0.998 R² (0.997 R² .. 0.999 R²)-mean 1.617 ms (1.603 ms .. 1.632 ms)-std dev 51.29 μs (42.45 μs .. 62.77 μs)-variance introduced by outliers: 19% (moderately inflated)+time 1.668 ms (1.655 ms .. 1.684 ms)+ 0.999 R² (0.999 R² .. 0.999 R²)+mean 1.674 ms (1.664 ms .. 1.690 ms)+std dev 42.55 μs (34.99 μs .. 54.22 μs)+variance introduced by outliers: 12% (moderately inflated) benchmarking binary-parser/lazy-bytestring/jp50-time 1.426 ms (1.399 ms .. 1.458 ms)- 0.998 R² (0.997 R² .. 0.999 R²)-mean 1.431 ms (1.419 ms .. 1.446 ms)-std dev 47.52 μs (39.10 μs .. 56.91 μs)-variance introduced by outliers: 21% (moderately inflated)+time 1.436 ms (1.420 ms .. 1.453 ms)+ 0.999 R² (0.998 R² .. 0.999 R²)+mean 1.476 ms (1.462 ms .. 1.490 ms)+std dev 47.49 μs (39.59 μs .. 57.24 μs)+variance introduced by outliers: 20% (moderately inflated) benchmarking attoparsec/numbers-time 550.2 μs (542.0 μs .. 558.2 μs)- 0.998 R² (0.997 R² .. 0.999 R²)-mean 555.0 μs (548.9 μs .. 566.3 μs)-std dev 26.67 μs (15.70 μs .. 47.26 μs)-variance introduced by outliers: 41% (moderately inflated)+time 549.6 μs (541.4 μs .. 558.1 μs)+ 0.999 R² (0.998 R² .. 0.999 R²)+mean 545.8 μs (541.5 μs .. 550.4 μs)+std dev 14.23 μs (11.57 μs .. 18.70 μs)+variance introduced by outliers: 17% (moderately inflated) benchmarking binary-parser/numbers-time 353.7 μs (349.1 μs .. 358.3 μs)+time 365.3 μs (361.6 μs .. 369.2 μs) 0.999 R² (0.998 R² .. 0.999 R²)-mean 355.1 μs (352.0 μs .. 358.6 μs)-std dev 11.49 μs (9.664 μs .. 14.16 μs)-variance introduced by outliers: 26% (moderately inflated)+mean 366.2 μs (363.1 μs .. 369.7 μs)+std dev 11.05 μs (9.100 μs .. 13.57 μs)+variance introduced by outliers: 23% (moderately inflated) benchmarking attoparsec/lazy-bytestring/numbers-time 555.6 μs (547.5 μs .. 563.2 μs)+time 550.6 μs (545.9 μs .. 554.0 μs) 0.999 R² (0.998 R² .. 0.999 R²)-mean 557.2 μs (551.7 μs .. 562.6 μs)-std dev 17.77 μs (15.35 μs .. 20.77 μs)-variance introduced by outliers: 23% (moderately inflated)+mean 547.2 μs (542.7 μs .. 551.8 μs)+std dev 14.99 μs (12.38 μs .. 19.36 μs)+variance introduced by outliers: 19% (moderately inflated) benchmarking binary-parser/lazy-bytestring/numbers-time 374.7 μs (358.4 μs .. 405.1 μs)- 0.973 R² (0.938 R² .. 0.999 R²)-mean 362.9 μs (357.1 μs .. 385.7 μs)-std dev 33.84 μs (9.270 μs .. 69.65 μs)-variance introduced by outliers: 75% (severely inflated)+time 370.4 μs (364.8 μs .. 379.3 μs)+ 0.932 R² (0.791 R² .. 0.999 R²)+mean 397.1 μs (371.9 μs .. 490.7 μs)+std dev 152.8 μs (12.14 μs .. 323.0 μs)+variance introduced by outliers: 99% (severely inflated) benchmarking attoparsec/twitter1-time 23.99 μs (23.79 μs .. 24.22 μs)- 0.999 R² (0.999 R² .. 0.999 R²)-mean 23.85 μs (23.61 μs .. 24.08 μs)-std dev 785.0 ns (666.1 ns .. 941.3 ns)-variance introduced by outliers: 37% (moderately inflated)+time 24.33 μs (24.01 μs .. 24.61 μs)+ 0.999 R² (0.998 R² .. 0.999 R²)+mean 24.11 μs (23.86 μs .. 24.38 μs)+std dev 907.2 ns (757.5 ns .. 1.133 μs)+variance introduced by outliers: 43% (moderately inflated) benchmarking binary-parser/twitter1-time 17.50 μs (17.24 μs .. 17.74 μs)- 0.998 R² (0.998 R² .. 0.999 R²)-mean 17.63 μs (17.38 μs .. 17.87 μs)-std dev 794.7 ns (649.8 ns .. 962.0 ns)-variance introduced by outliers: 53% (severely inflated)+time 18.40 μs (18.27 μs .. 18.54 μs)+ 0.999 R² (0.999 R² .. 0.999 R²)+mean 18.39 μs (18.19 μs .. 18.58 μs)+std dev 657.9 ns (537.6 ns .. 849.5 ns)+variance introduced by outliers: 42% (moderately inflated) benchmarking attoparsec/lazy-bytestring/twitter1-time 23.77 μs (23.55 μs .. 23.96 μs)- 0.999 R² (0.999 R² .. 0.999 R²)-mean 23.91 μs (23.67 μs .. 24.18 μs)-std dev 838.7 ns (646.4 ns .. 1.126 μs)-variance introduced by outliers: 40% (moderately inflated)+time 24.34 μs (24.10 μs .. 24.62 μs)+ 0.999 R² (0.998 R² .. 0.999 R²)+mean 24.30 μs (24.00 μs .. 24.57 μs)+std dev 959.3 ns (787.1 ns .. 1.229 μs)+variance introduced by outliers: 46% (moderately inflated) benchmarking binary-parser/lazy-bytestring/twitter1-time 17.30 μs (17.17 μs .. 17.42 μs)+time 18.27 μs (18.11 μs .. 18.45 μs) 0.999 R² (0.999 R² .. 0.999 R²)-mean 17.31 μs (17.15 μs .. 17.49 μs)-std dev 557.8 ns (451.0 ns .. 701.1 ns)-variance introduced by outliers: 37% (moderately inflated)+mean 18.43 μs (18.25 μs .. 18.65 μs)+std dev 627.3 ns (509.6 ns .. 763.0 ns)+variance introduced by outliers: 39% (moderately inflated) benchmarking attoparsec/twitter10-time 166.0 μs (164.0 μs .. 168.0 μs)- 0.998 R² (0.998 R² .. 0.999 R²)-mean 166.2 μs (164.3 μs .. 168.2 μs)-std dev 6.722 μs (5.565 μs .. 8.233 μs)-variance introduced by outliers: 40% (moderately inflated)+time 177.9 μs (175.8 μs .. 179.7 μs)+ 0.999 R² (0.999 R² .. 0.999 R²)+mean 176.6 μs (175.0 μs .. 178.3 μs)+std dev 5.613 μs (4.525 μs .. 7.147 μs)+variance introduced by outliers: 28% (moderately inflated) benchmarking binary-parser/twitter10-time 129.0 μs (125.0 μs .. 136.1 μs)- 0.968 R² (0.914 R² .. 0.999 R²)-mean 130.8 μs (127.4 μs .. 143.7 μs)-std dev 19.73 μs (4.362 μs .. 41.31 μs)-variance introduced by outliers: 91% (severely inflated)+time 137.7 μs (133.9 μs .. 141.0 μs)+ 0.974 R² (0.940 R² .. 0.996 R²)+mean 217.6 μs (158.7 μs .. 343.3 μs)+std dev 289.1 μs (104.6 μs .. 496.4 μs)+variance introduced by outliers: 99% (severely inflated) benchmarking attoparsec/lazy-bytestring/twitter10-time 165.5 μs (163.8 μs .. 167.2 μs)+time 172.6 μs (171.0 μs .. 174.1 μs) 0.999 R² (0.998 R² .. 0.999 R²)-mean 167.4 μs (165.4 μs .. 169.5 μs)-std dev 6.295 μs (5.242 μs .. 7.620 μs)-variance introduced by outliers: 36% (moderately inflated)+mean 174.4 μs (172.5 μs .. 176.7 μs)+std dev 7.031 μs (5.406 μs .. 9.696 μs)+variance introduced by outliers: 39% (moderately inflated) benchmarking binary-parser/lazy-bytestring/twitter10-time 131.0 μs (128.5 μs .. 134.4 μs)- 0.997 R² (0.995 R² .. 0.999 R²)-mean 129.8 μs (128.5 μs .. 131.8 μs)-std dev 5.415 μs (3.935 μs .. 7.494 μs)-variance introduced by outliers: 42% (moderately inflated)+time 138.8 μs (137.9 μs .. 139.9 μs)+ 0.999 R² (0.999 R² .. 0.999 R²)+mean 140.6 μs (139.2 μs .. 142.2 μs)+std dev 4.915 μs (3.984 μs .. 6.230 μs)+variance introduced by outliers: 33% (moderately inflated) benchmarking attoparsec/twitter100-time 2.183 ms (2.148 ms .. 2.220 ms)+time 2.273 ms (2.236 ms .. 2.301 ms) 0.998 R² (0.997 R² .. 0.999 R²)-mean 2.197 ms (2.175 ms .. 2.224 ms)-std dev 88.02 μs (64.96 μs .. 133.4 μs)-variance introduced by outliers: 26% (moderately inflated)+mean 2.276 ms (2.258 ms .. 2.299 ms)+std dev 69.99 μs (50.91 μs .. 109.2 μs)+variance introduced by outliers: 17% (moderately inflated) benchmarking binary-parser/twitter100-time 1.865 ms (1.839 ms .. 1.890 ms)+time 2.035 ms (2.007 ms .. 2.059 ms) 0.998 R² (0.997 R² .. 0.999 R²)-mean 1.873 ms (1.852 ms .. 1.897 ms)-std dev 74.75 μs (60.54 μs .. 95.21 μs)-variance introduced by outliers: 26% (moderately inflated)+mean 2.056 ms (2.034 ms .. 2.078 ms)+std dev 74.85 μs (62.02 μs .. 88.08 μs)+variance introduced by outliers: 22% (moderately inflated) benchmarking attoparsec/lazy-bytestring/twitter100-time 2.251 ms (2.221 ms .. 2.284 ms)- 0.999 R² (0.998 R² .. 0.999 R²)-mean 2.287 ms (2.267 ms .. 2.310 ms)-std dev 73.91 μs (55.21 μs .. 97.13 μs)-variance introduced by outliers: 17% (moderately inflated)+time 2.550 ms (2.322 ms .. 2.870 ms)+ 0.960 R² (0.931 R² .. 0.998 R²)+mean 2.359 ms (2.322 ms .. 2.459 ms)+std dev 194.3 μs (75.87 μs .. 386.2 μs)+variance introduced by outliers: 58% (severely inflated) benchmarking binary-parser/lazy-bytestring/twitter100-time 1.854 ms (1.802 ms .. 1.886 ms)- 0.963 R² (0.870 R² .. 0.999 R²)-mean 1.992 ms (1.905 ms .. 2.391 ms)-std dev 509.8 μs (62.89 μs .. 1.153 ms)-variance introduced by outliers: 94% (severely inflated)+time 2.016 ms (1.983 ms .. 2.050 ms)+ 0.998 R² (0.997 R² .. 0.999 R²)+mean 2.052 ms (2.031 ms .. 2.078 ms)+std dev 80.58 μs (63.40 μs .. 112.5 μs)+variance introduced by outliers: 25% (moderately inflated) benchmarking attoparsec/twitter20-time 359.4 μs (354.8 μs .. 364.8 μs)- 0.998 R² (0.998 R² .. 0.999 R²)-mean 361.2 μs (357.4 μs .. 364.7 μs)-std dev 12.05 μs (10.01 μs .. 14.71 μs)-variance introduced by outliers: 27% (moderately inflated)+time 377.3 μs (373.5 μs .. 380.8 μs)+ 0.999 R² (0.998 R² .. 0.999 R²)+mean 372.9 μs (369.3 μs .. 376.9 μs)+std dev 12.50 μs (10.42 μs .. 15.59 μs)+variance introduced by outliers: 28% (moderately inflated) benchmarking binary-parser/twitter20-time 311.8 μs (307.3 μs .. 315.7 μs)- 0.998 R² (0.997 R² .. 0.999 R²)-mean 310.6 μs (307.1 μs .. 314.6 μs)-std dev 12.47 μs (9.920 μs .. 16.24 μs)-variance introduced by outliers: 36% (moderately inflated)+time 331.1 μs (327.1 μs .. 335.0 μs)+ 0.999 R² (0.998 R² .. 0.999 R²)+mean 329.2 μs (325.8 μs .. 332.4 μs)+std dev 11.08 μs (9.652 μs .. 13.51 μs)+variance introduced by outliers: 28% (moderately inflated) benchmarking attoparsec/lazy-bytestring/twitter20-time 361.3 μs (357.9 μs .. 364.9 μs)+time 375.3 μs (372.2 μs .. 377.7 μs) 0.999 R² (0.999 R² .. 0.999 R²)-mean 362.2 μs (359.4 μs .. 365.5 μs)-std dev 9.791 μs (7.821 μs .. 13.13 μs)-variance introduced by outliers: 20% (moderately inflated)+mean 372.5 μs (369.2 μs .. 376.2 μs)+std dev 11.27 μs (9.275 μs .. 14.00 μs)+variance introduced by outliers: 23% (moderately inflated) benchmarking binary-parser/lazy-bytestring/twitter20-time 305.9 μs (303.5 μs .. 308.5 μs)+time 333.5 μs (330.7 μs .. 336.2 μs) 0.999 R² (0.998 R² .. 0.999 R²)-mean 309.5 μs (306.4 μs .. 313.3 μs)-std dev 11.72 μs (9.567 μs .. 15.23 μs)-variance introduced by outliers: 34% (moderately inflated)+mean 334.0 μs (330.9 μs .. 337.5 μs)+std dev 10.37 μs (8.658 μs .. 13.04 μs)+variance introduced by outliers: 25% (moderately inflated) benchmarking attoparsec/twitter50-time 1.074 ms (1.065 ms .. 1.084 ms)- 0.999 R² (0.998 R² .. 0.999 R²)-mean 1.079 ms (1.069 ms .. 1.092 ms)-std dev 40.33 μs (30.96 μs .. 54.69 μs)-variance introduced by outliers: 26% (moderately inflated)+time 1.247 ms (1.125 ms .. 1.524 ms)+ 0.876 R² (0.782 R² .. 0.999 R²)+mean 1.169 ms (1.134 ms .. 1.326 ms)+std dev 208.9 μs (24.07 μs .. 477.5 μs)+variance introduced by outliers: 89% (severely inflated) benchmarking binary-parser/twitter50-time 943.5 μs (930.2 μs .. 956.8 μs)- 0.999 R² (0.998 R² .. 0.999 R²)-mean 956.1 μs (948.7 μs .. 964.3 μs)-std dev 25.24 μs (20.12 μs .. 31.51 μs)-variance introduced by outliers: 16% (moderately inflated)+time 1.020 ms (1.008 ms .. 1.031 ms)+ 0.998 R² (0.998 R² .. 0.999 R²)+mean 1.032 ms (1.023 ms .. 1.042 ms)+std dev 32.65 μs (26.99 μs .. 40.35 μs)+variance introduced by outliers: 20% (moderately inflated) benchmarking attoparsec/lazy-bytestring/twitter50-time 1.051 ms (1.041 ms .. 1.064 ms)- 0.999 R² (0.998 R² .. 0.999 R²)-mean 1.061 ms (1.051 ms .. 1.070 ms)-std dev 33.20 μs (27.71 μs .. 41.49 μs)-variance introduced by outliers: 21% (moderately inflated)+time 1.105 ms (1.085 ms .. 1.119 ms)+ 0.997 R² (0.996 R² .. 0.998 R²)+mean 1.144 ms (1.122 ms .. 1.176 ms)+std dev 88.80 μs (68.65 μs .. 110.9 μs)+variance introduced by outliers: 60% (severely inflated) benchmarking binary-parser/lazy-bytestring/twitter50-time 948.1 μs (925.7 μs .. 975.2 μs)- 0.996 R² (0.994 R² .. 0.998 R²)-mean 947.5 μs (937.1 μs .. 959.5 μs)-std dev 38.20 μs (31.36 μs .. 47.85 μs)-variance introduced by outliers: 31% (moderately inflated)+time 1.026 ms (1.015 ms .. 1.038 ms)+ 0.999 R² (0.998 R² .. 0.999 R²)+mean 1.035 ms (1.027 ms .. 1.043 ms)+std dev 28.09 μs (22.72 μs .. 36.10 μs)+variance introduced by outliers: 16% (moderately inflated) Benchmark criterion: FINISH ```
bench/Bench.hs view
@@ -11,10 +11,16 @@ main :: IO () main = do http <- HttpReq.headers++ putStrLn "start benchmark http request parser"+ defaultMain http + putStrLn "start benchmark JSON parser"+ aeson <- Aeson.aeson aesonbp <- AesonBP.aeson aesonLazy <- Aeson.aesonLazy aesonbpLazy <- AesonBP.aesonLazy+ (defaultMain . concat . transpose) [ aeson, aesonbp, aesonLazy, aesonbpLazy ]
bench/HttpReq.hs view
@@ -8,12 +8,14 @@ import Control.DeepSeq (NFData(..)) import Criterion.Types (Benchmark) import Network.Wai.Handler.Warp.RequestHeader (parseHeaderLines)+import Data.ByteString.Internal (c2w, w2c) import qualified Data.Attoparsec.ByteString as AP import qualified Data.Attoparsec.ByteString.Char8 as APC import qualified Data.ByteString.Char8 as BC import qualified Data.Binary.Parser as BP import qualified Data.Binary.Parser.Char8 as BPC import Network.HTTP.Types.Version (HttpVersion, http11)+import qualified Scanner as SC headers :: IO [Benchmark] headers = do@@ -21,6 +23,7 @@ return [ bench "http-req/attoparsec" $ nf (AP.parseOnly attoRequest) req , bench "http-req/binary-parsers" $ nf (BP.parseOnly bpRequest) req+ , bench "http-req/scanner" $ nf (SC.scanOnly scRequest) req , bench "http-req/warp" $ nfIO (parseHeaderLines (BC.lines req)) ] @@ -65,7 +68,7 @@ || ('0' <= c && c <= '0') || c == '_' || c == '-' -bpBodyLine = BPC.takeTill (\c -> c == '\r' || c == '\n') <* BP.satisfy BP.isEndOfLine+bpBodyLine = BPC.takeTill (\c -> c == '\r' || c == '\n') <* BP.endOfLine bpReqLine = do m <- (BPC.takeTill BPC.isSpace <* BPC.char ' ')@@ -75,10 +78,48 @@ bpHttpVersion = http11 <$ BP.string "HTTP/1.1" -bpRequest = (,) <$> (bpReqLine <* BP.satisfy BP.isEndOfLine) <*> bpManyHeader+bpRequest = (,) <$> (bpReqLine <* BP.endOfLine) <*> bpManyHeader bpManyHeader = do c <- BPC.peek if c == '\r' || c == '\n' then return [] else (:) <$> bpHeader <*> bpManyHeader++--------------------------------------------------------------------------------++scHeader = do+ name <- takeWhile1 (isHeaderChar . w2c) <* SC.char8 ':' <* SC.skipSpace+ body <- scBodyLine+ return (name, body)+ where+ isHeaderChar c = ('a' <= c && c <= 'z')+ || ('A' <= c && c <= 'Z')+ || ('0' <= c && c <= '0')+ || c == '_' || c == '-'++ takeWhile1 p = do+ bs <- SC.takeWhile p+ if BC.null bs then fail "takeWhile1" else return bs++scBodyLine = SC.takeWhile (\w -> let c = w2c w in c /= '\r' && c /= '\n') <* SC.char8 '\n'++scReqLine = do+ m <- (SC.takeWhile (not . BP.isSpace) <* SC.char8 ' ')+ (p,q) <- BC.break (=='?') <$> (SC.takeWhile (not . BP.isSpace) <* SC.char8 ' ')+ v <- scHttpVersion+ return (m,p,q,v)++scHttpVersion = http11 <$ SC.string "HTTP/1.1"++scRequest = (,) <$> (scReqLine <* SC.char8 '\n') <*> scManyHeader++scManyHeader = do+ w <- SC.lookAhead+ case w of+ Just w' -> do+ let c = w2c w'+ if c == '\r' || c == '\n'+ then return []+ else (:) <$> scHeader <*> scManyHeader+ _ -> fail "scManyHeader"
binary-parsers.cabal view
@@ -1,5 +1,5 @@ name: binary-parsers-version: 0.2.0.0+version: 0.2.1.0 synopsis: Extends binary with parsec/attoparsec style parsing combinators. description: Extends binary with parsec/attoparsec style parsing combinators. license: BSD3@@ -61,6 +61,7 @@ , unordered-containers , http-types , case-insensitive+ , scanner default-language: Haskell2010 hs-source-dirs: bench