@@ -0,0 +1,54 @@
1+{-# OPTIONS_GHC -fno-warn-orphans#-}
6+import qualified Data.ByteString.Lazy as BL
7+import qualified Text.JSON as J
8+import qualified Data.Aeson as A
10+instance (NFData v) => NFData (J.JSObject v) where
11+ rnf o = rnf (J.fromJSObject o)
13+instance NFData J.JSValue where
15+ rnf (J.JSBool b) = rnf b
16+ rnf (J.JSRational a b) = rnf a `seq` rnf b `seq` ()
17+ rnf (J.JSString s) = rnf (J.fromJSString s)
18+ rnf (J.JSArray lst) = rnf lst
19+ rnf (J.JSObject o) = rnf o
21+encodeJ :: J.JSObject J.JSValue -> Int
22+encodeJ = length . J.encode
24+encodeA :: A.Value -> Int64
25+encodeA = BL.length . A.encode
27+decodeJ :: String -> J.JSObject J.JSValue
29+ case J.decodeStrict s of
31+ J.Error _ -> error "fail to parse via JSON"
33+decodeA :: BL.ByteString -> A.Value
34+decodeA s = case A.decode' s of
35+ Nothing -> error "fail to parse via Aeson"
39+jsonData = "benchmarks/json-data/jp100.json"
43+ js <- readFile jsonData
44+ as <- BL.readFile jsonData
45+ let jdata = decodeJ js
47+ (jdata, adata) `deepseq` defaultMain [
48+ bgroup "decode" [ bench "json" $ nf decodeJ js
49+ , bench "aeson" $ nf decodeA as
51+ bgroup "encode" [ bench "json" $ nf encodeJ jdata
52+ , bench "aeson" $ nf encodeA adata