on 0.11.2.1 help sign in
typeable/aeson/benchmarks/CompareWithJSON.hs
85 lines 2.7 kB history raw
1{-# OPTIONS_GHC -fno-warn-orphans #-}
3import Blaze.ByteString.Builder (toLazyByteString)
4import Blaze.ByteString.Builder.Char.Utf8 (fromString)
5import Control.DeepSeq (NFData(rnf))
6import Criterion.Main
7import qualified Data.Aeson.Encode as A
8import qualified Data.Aeson as A
9import qualified Data.ByteString.Lazy as BL
10import qualified Text.JSON as J
11import qualified Data.Text.Lazy as TL
12import qualified Data.Text.Lazy.Builder as TLB
13import qualified Data.Text.Lazy.Encoding as TLE
15instance (NFData v) => NFData (J.JSObject v) where
16 rnf o = rnf (J.fromJSObject o)
18instance NFData J.JSValue where
19 rnf J.JSNull = ()
20 rnf (J.JSBool b) = rnf b
21 rnf (J.JSRational a b) = rnf a `seq` rnf b `seq` ()
22 rnf (J.JSString s) = rnf (J.fromJSString s)
23 rnf (J.JSArray lst) = rnf lst
24 rnf (J.JSObject o) = rnf o
26decodeJ :: String -> J.JSValue
27decodeJ s =
28 case J.decodeStrict s of
29 J.Ok v -> v
30 J.Error _ -> error "fail to parse via JSON"
32decodeA :: BL.ByteString -> A.Value
33decodeA s = case A.decode s of
34 Just v -> v
35 Nothing -> error "fail to parse via Aeson"
37decodeA' :: BL.ByteString -> A.Value
38decodeA' s = case A.decode' s of
39 Just v -> v
40 Nothing -> error "fail to parse via Aeson"
42encodeJ :: J.JSValue -> BL.ByteString
43encodeJ = toLazyByteString . fromString . J.encode
45encodeToText :: A.Value -> TL.Text
46encodeToText = TLB.toLazyText . A.encodeToTextBuilder . A.toJSON
48encodeViaText :: A.Value -> BL.ByteString
49encodeViaText = TLE.encodeUtf8 . encodeToText
51main :: IO ()
52main = do
53 let enFile = "json-data/twitter100.json"
54 jpFile = "json-data/jp100.json"
55 enA <- BL.readFile enFile
56 enJ <- readFile enFile
57 jpA <- BL.readFile jpFile
58 jpJ <- readFile jpFile
59 defaultMain [
60 bgroup "decode" [
61 bgroup "en" [
62 bench "aeson/lazy" $ nf decodeA enA
63 , bench "aeson/strict" $ nf decodeA' enA
64 , bench "json" $ nf decodeJ enJ
65 ]
66 , bgroup "jp" [
67 bench "aeson" $ nf decodeA jpA
68 , bench "json" $ nf decodeJ jpJ
69 ]
70 ]
71 , bgroup "encode" [
72 bgroup "en" [
73 bench "aeson-to-bytestring" $ nf A.encode (decodeA enA)
74 , bench "aeson-via-text-to-bytestring" $ nf encodeViaText (decodeA enA)
75 , bench "aeson-to-text" $ nf encodeToText (decodeA enA)
76 , bench "json" $ nf encodeJ (decodeJ enJ)
77 ]
78 , bgroup "jp" [
79 bench "aeson-to-bytestring" $ nf A.encode (decodeA jpA)
80 , bench "aeson-via-text-to-bytestring" $ nf encodeViaText (decodeA jpA)
81 , bench "aeson-to-text" $ nf encodeToText (decodeA jpA)
82 , bench "json" $ nf encodeJ (decodeJ jpJ)
83 ]
84 ]
85 ]