@@ -1,3 +1,4 @@
1+{-# LANGUAGE PackageImports #-}
1{-# OPTIONS_GHC -fno-warn-orphans #-}
2{-# OPTIONS_GHC -fno-warn-orphans #-}
3module Main (main) where
4module Main (main) where
@@ -10,8 +11,11 @@ import Blaze.ByteString.Builder.Char.Utf8 (fromString)
10import Control.DeepSeq (NFData(rnf))
11import Control.DeepSeq (NFData(rnf))
11import Criterion.Main
12import Criterion.Main
12import Data.Maybe (fromMaybe)
13import Data.Maybe (fromMaybe)
13−import qualified Data.Aeson as A
14+import qualified "aeson-benchmarks" Data.Aeson as A
14−import qualified Data.Aeson.Text as A
15+import qualified "aeson-benchmarks" Data.Aeson.Text as A
16+import qualified "aeson-benchmarks" Data.Aeson.Parser.Internal as I
17+import qualified "aeson" Data.Aeson as B
18+import qualified Data.ByteString as BS
15import qualified Data.ByteString.Lazy as BL
19import qualified Data.ByteString.Lazy as BL
16import qualified Data.Text.Lazy as TL
20import qualified Data.Text.Lazy as TL
17import qualified Data.Text.Lazy.Builder as TLB
21import qualified Data.Text.Lazy.Builder as TLB
@@ -41,6 +45,19 @@ decodeA s = fromMaybe (error "fail to parse via Aeson") $ A.decode s
41decodeA' :: BL.ByteString -> A.Value
45decodeA' :: BL.ByteString -> A.Value
42decodeA' s = fromMaybe (error "fail to parse via Aeson") $ A.decode' s
46decodeA' s = fromMaybe (error "fail to parse via Aeson") $ A.decode' s
48+decodeAS :: BS.ByteString -> A.Value
49+decodeAS s = fromMaybe (error "fail to parse via Aeson") $ A.decodeStrict' s
51+decodeB :: BL.ByteString -> B.Value
52+decodeB s = fromMaybe (error "fail to parse via Aeson") $ B.decode s
54+decodeBS :: BS.ByteString -> B.Value
55+decodeBS s = fromMaybe (error "fail to parse via Aeson") $ B.decodeStrict' s
57+decodeIP :: BL.ByteString -> A.Value
58+decodeIP s = fromMaybe (error "fail to parse via Parser.decodeWith") $
59+ I.decodeWith I.jsonEOF A.fromJSON s
44encodeJ :: J.JSValue -> BL.ByteString
61encodeJ :: J.JSValue -> BL.ByteString
45encodeJ = toLazyByteString . fromString . J.encode
62encodeJ = toLazyByteString . fromString . J.encode
@@ -55,19 +72,27 @@ main = do
55 let enFile = "json-data/twitter100.json"
72 let enFile = "json-data/twitter100.json"
56 jpFile = "json-data/jp100.json"
73 jpFile = "json-data/jp100.json"
57 enA <- BL.readFile enFile
74 enA <- BL.readFile enFile
75+ enS <- BS.readFile enFile
58 enJ <- readFile enFile
76 enJ <- readFile enFile
59 jpA <- BL.readFile jpFile
77 jpA <- BL.readFile jpFile
78+ jpS <- BS.readFile jpFile
60 jpJ <- readFile jpFile
79 jpJ <- readFile jpFile
61 defaultMain [
80 defaultMain [
62 bgroup "decode" [
81 bgroup "decode" [
63 bgroup "en" [
82 bgroup "en" [
64− bench "aeson/lazy" $ nf decodeA enA
83+ bench "aeson/lazy" $ nf decodeA enA
65− , bench "aeson/strict" $ nf decodeA' enA
84+ , bench "aeson/strict" $ nf decodeA' enA
85+ , bench "aeson/stricter" $ nf decodeAS enS
86+ , bench "aeson/hackage" $ nf decodeB enA
87+ , bench "aeson/hackage'" $ nf decodeBS enS
88+ , bench "aeson/parser" $ nf decodeIP enA
66− , bench "json" $ nf decodeJ enJ
89+ , bench "json" $ nf decodeJ enJ
68 , bgroup "jp" [
91 , bgroup "jp" [
69− bench "aeson" $ nf decodeA jpA
92+ bench "aeson" $ nf decodeA jpA
93+ , bench "aeson/stricter" $ nf decodeAS jpS
94+ , bench "aeson/hackage" $ nf decodeB jpA
70− , bench "json" $ nf decodeJ jpJ
95+ , bench "json" $ nf decodeJ jpJ
73 , bgroup "encode" [
98 , bgroup "encode" [