@@ -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)
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
35+decodeAtto :: LBS.ByteString -> Maybe Scientific
37+ = parseOnly (scientific <* AttoL.endOfInput)
39+ parseOnly p lbs = case AttoL.parse p lbs of
40+ AttoL.Done _ r -> Just r
41+ AttoL.Fail _ _ _ -> Nothing
43+decodeAtto8 :: LBS.ByteString -> Maybe Scientific
45+ = parseOnly (Atto8.scientific <* AttoL.endOfInput)
47+ parseOnly p lbs = case AttoL.parse p lbs of
48+ AttoL.Done _ r -> Just r
49+ AttoL.Fail _ _ _ -> Nothing
32generate :: Int64 -> LBS.ByteString
51generate :: Int64 -> LBS.ByteString
33generate n = LBS8.replicate n '1'
52generate n = LBS8.replicate n '1'
@@ -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