on 1.2.2.0 help sign in
typeable/aeson/benchmarks/CompareWithJSON.hs
112 lines 3.8 kB history raw
1{-# LANGUAGE PackageImports #-}
2{-# OPTIONS_GHC -fno-warn-orphans #-}
4module Main (main) where
6import Prelude ()
7import Prelude.Compat
9import Blaze.ByteString.Builder (toLazyByteString)
10import Blaze.ByteString.Builder.Char.Utf8 (fromString)
11import Control.DeepSeq (NFData(rnf))
12import Criterion.Main
13import Data.Maybe (fromMaybe)
14import qualified "aeson-benchmarks" Data.Aeson as A
15import qualified "aeson-benchmarks" Data.Aeson.Text as A
16import qualified "aeson-benchmarks" Data.Aeson.Parser.Internal as I
17import qualified "aeson" Data.Aeson as B
18import qualified Data.ByteString as BS
19import qualified Data.ByteString.Lazy as BL
20import qualified Data.Text.Lazy as TL
21import qualified Data.Text.Lazy.Builder as TLB
22import qualified Data.Text.Lazy.Encoding as TLE
23import qualified Text.JSON as J
25instance (NFData v) => NFData (J.JSObject v) where
26 rnf o = rnf (J.fromJSObject o)
28instance NFData J.JSValue where
29 rnf J.JSNull = ()
30 rnf (J.JSBool b) = rnf b
31 rnf (J.JSRational a b) = rnf a `seq` rnf b `seq` ()
32 rnf (J.JSString s) = rnf (J.fromJSString s)
33 rnf (J.JSArray lst) = rnf lst
34 rnf (J.JSObject o) = rnf o
36decodeJ :: String -> J.JSValue
37decodeJ s =
38 case J.decodeStrict s of
39 J.Ok v -> v
40 J.Error _ -> error "fail to parse via JSON"
42decodeA :: BL.ByteString -> A.Value
43decodeA s = fromMaybe (error "fail to parse via Aeson") $ A.decode s
45decodeA' :: BL.ByteString -> A.Value
46decodeA' s = fromMaybe (error "fail to parse via Aeson") $ A.decode' s
48decodeAS :: BS.ByteString -> A.Value
49decodeAS s = fromMaybe (error "fail to parse via Aeson") $ A.decodeStrict' s
51decodeB :: BL.ByteString -> B.Value
52decodeB s = fromMaybe (error "fail to parse via Aeson") $ B.decode s
54decodeBS :: BS.ByteString -> B.Value
55decodeBS s = fromMaybe (error "fail to parse via Aeson") $ B.decodeStrict' s
57decodeIP :: BL.ByteString -> A.Value
58decodeIP s = fromMaybe (error "fail to parse via Parser.decodeWith") $
59 I.decodeWith I.jsonEOF A.fromJSON s
61encodeJ :: J.JSValue -> BL.ByteString
62encodeJ = toLazyByteString . fromString . J.encode
64encodeToText :: A.Value -> TL.Text
65encodeToText = TLB.toLazyText . A.encodeToTextBuilder . A.toJSON
67encodeViaText :: A.Value -> BL.ByteString
68encodeViaText = TLE.encodeUtf8 . encodeToText
70main :: IO ()
71main = do
72 let enFile = "json-data/twitter100.json"
73 jpFile = "json-data/jp100.json"
74 enA <- BL.readFile enFile
75 enS <- BS.readFile enFile
76 enJ <- readFile enFile
77 jpA <- BL.readFile jpFile
78 jpS <- BS.readFile jpFile
79 jpJ <- readFile jpFile
80 defaultMain [
81 bgroup "decode" [
82 bgroup "en" [
83 bench "aeson/lazy" $ 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
89 , bench "json" $ nf decodeJ enJ
90 ]
91 , bgroup "jp" [
92 bench "aeson" $ nf decodeA jpA
93 , bench "aeson/stricter" $ nf decodeAS jpS
94 , bench "aeson/hackage" $ nf decodeB jpA
95 , bench "json" $ nf decodeJ jpJ
96 ]
97 ]
98 , bgroup "encode" [
99 bgroup "en" [
100 bench "aeson-to-bytestring" $ nf A.encode (decodeA enA)
101 , bench "aeson-via-text-to-bytestring" $ nf encodeViaText (decodeA enA)
102 , bench "aeson-to-text" $ nf encodeToText (decodeA enA)
103 , bench "json" $ nf encodeJ (decodeJ enJ)
104 ]
105 , bgroup "jp" [
106 bench "aeson-to-bytestring" $ nf A.encode (decodeA jpA)
107 , bench "aeson-via-text-to-bytestring" $ nf encodeViaText (decodeA jpA)
108 , bench "aeson-to-text" $ nf encodeToText (decodeA jpA)
109 , bench "json" $ nf encodeJ (decodeJ jpJ)
110 ]
111 ]
112 ]