on master help sign in
Bench Parser.scientific, and attoparsec variant
47e07b9Oleg Grenrus
benchmarks/Issue673.hs+21
@@ -18,7 +18,10 @@ import Criterion.Main
18import Prelude.Compat
18import Prelude.Compat
19import Data.Int (Int64)
19import Data.Int (Int64)
20import Data.Scientific (Scientific)
20import Data.Scientific (Scientific)
21+import Data.Aeson.Parser (scientific)
21
22
23+import qualified Data.Attoparsec.ByteString.Lazy as AttoL
24+import qualified Data.Attoparsec.ByteString.Char8 as Atto8
22import qualified Data.Aeson as A
25import qualified Data.Aeson as A
23import qualified Data.ByteString.Lazy as LBS
26import qualified Data.ByteString.Lazy as LBS
24import qualified Data.ByteString.Lazy.Char8 as LBS8
27import qualified Data.ByteString.Lazy.Char8 as LBS8
@@ -29,6 +32,22 @@ decodeInt = A.decode
29decodeScientific :: LBS.ByteString -> Maybe Scientific
32decodeScientific :: LBS.ByteString -> Maybe Scientific
30decodeScientific = A.decode
33decodeScientific = A.decode
31
34
35+decodeAtto :: LBS.ByteString -> Maybe Scientific
36+decodeAtto
37+ = parseOnly (scientific <* AttoL.endOfInput)
38+ where
39+ parseOnly p lbs = case AttoL.parse p lbs of
40+ AttoL.Done _ r -> Just r
41+ AttoL.Fail _ _ _ -> Nothing
42+
43+decodeAtto8 :: LBS.ByteString -> Maybe Scientific
44+decodeAtto8
45+ = parseOnly (Atto8.scientific <* AttoL.endOfInput)
46+ where
47+ parseOnly p lbs = case AttoL.parse p lbs of
48+ AttoL.Done _ r -> Just r
49+ AttoL.Fail _ _ _ -> Nothing
50+
32generate :: Int64 -> LBS.ByteString
51generate :: Int64 -> LBS.ByteString
33generate n = LBS8.replicate n '1'
52generate n = LBS8.replicate n '1'
34
53
@@ -77,4 +96,6 @@ main = defaultMain
77 benchPair name input = bgroup name
96 benchPair name input = bgroup name
78 [ bench "Int" $ whnf decodeInt input
97 [ bench "Int" $ whnf decodeInt input
79 , bench "Scientific" $ whnf decodeScientific input
98 , bench "Scientific" $ whnf decodeScientific input
99+ , bench "parserA" $ whnf decodeAtto input
100+ , bench "parserS" $ whnf decodeAtto8 input
80 ]
101 ]
benchmarks/aeson-benchmarks.cabal+1
@@ -333,6 +333,7 @@ executable aeson-issue-673
333 ghc-options: -Wall -O1 -rtsopts
333 ghc-options: -Wall -O1 -rtsopts
334 build-depends:
334 build-depends:
335 aeson-benchmarks,
335 aeson-benchmarks,
336+ attoparsec,
336 base,
337 base,
337 bytestring,
338 bytestring,
338 scientific,
339 scientific,