@@ -1,9 +1,7 @@
1−{-# LANGUAGE OverloadedStrings, RankNTypes #-}
1+{-# LANGUAGE OverloadedStrings, RankNTypes, PackageImports, FlexibleContexts #-}
22
33import Control.DeepSeq
44import Criterion.Main
5−import Data.Aeson
6−import Data.Aeson.Types (fromJSONKeyCoerce)
75import Data.Hashable
86import Data.Proxy (Proxy (..))
97import Data.Tagged (Tagged (..))
@@ -12,6 +10,11 @@ import qualified Data.Text as T
1210import qualified Data.Map as M
1311import qualified Data.HashMap.Strict as HM
1412
13+import qualified "aeson" Data.Aeson as A
14+
15+import qualified "aeson-benchmarks" Data.Aeson as B
16+import qualified "aeson-benchmarks" Data.Aeson.Types as B (fromJSONKeyCoerce)
17+
1518value :: Int -> HM.HashMap T.Text T.Text
1619value n = HM.fromList $ map f [1..n]
1720 where
@@ -35,10 +38,11 @@ instance NFData T1 where
3538 rnf (T1 t) = rnf t
3639instance Hashable T1 where
3740 hashWithSalt salt (T1 t) = hashWithSalt salt t
38−instance FromJSON T1 where
39− parseJSON = withText "T1" $ pure . T1
40−instance FromJSONKey T1 where
41− fromJSONKey = FromJSONKeyText T1
41+
42+instance B.FromJSON T1 where
43+ parseJSON = B.withText "T1" $ pure . T1
44+instance B.FromJSONKey T1 where
45+ fromJSONKey = B.FromJSONKeyText T1
4246
4347-------------------------------------------------------------------------------
4448-- Coerce
@@ -51,10 +55,11 @@ instance NFData T2 where
5155 rnf (T2 t) = rnf t
5256instance Hashable T2 where
5357 hashWithSalt salt (T2 t) = hashWithSalt salt t
54−instance FromJSON T2 where
55− parseJSON = withText "T2" $ pure . T2
56−instance FromJSONKey T2 where
57− fromJSONKey = fromJSONKeyCoerce
58+
59+instance B.FromJSON T2 where
60+ parseJSON = B.withText "T2" $ pure . T2
61+instance B.FromJSONKey T2 where
62+ fromJSONKey = B.fromJSONKeyCoerce
5863
5964-------------------------------------------------------------------------------
6065-- TextParser
@@ -67,10 +72,11 @@ instance NFData T3 where
6772 rnf (T3 t) = rnf t
6873instance Hashable T3 where
6974 hashWithSalt salt (T3 t) = hashWithSalt salt t
70−instance FromJSON T3 where
71− parseJSON = withText "T3" $ pure . T3
72−instance FromJSONKey T3 where
73− fromJSONKey = FromJSONKeyTextParser (pure . T3)
75+
76+instance B.FromJSON T3 where
77+ parseJSON = B.withText "T3" $ pure . T3
78+instance B.FromJSONKey T3 where
79+ fromJSONKey = B.FromJSONKeyTextParser (pure . T3)
7480
7581-------------------------------------------------------------------------------
7682-- Values
@@ -83,30 +89,40 @@ value1000 = value 1000
8389value10000 = value 10000
8490
8591encodedValue10 :: LBS.ByteString
86−encodedValue10 = encode $ value10
92+encodedValue10 = B.encode $ value10
8793
8894encodedValue100 :: LBS.ByteString
89−encodedValue100 = encode $ value100
95+encodedValue100 = B.encode $ value100
9096
9197encodedValue1000 :: LBS.ByteString
92−encodedValue1000 = encode $ value1000
98+encodedValue1000 = B.encode $ value1000
9399
94100encodedValue10000 :: LBS.ByteString
95−encodedValue10000 = encode $ value10000
101+encodedValue10000 = B.encode $ value10000
96102
97103-------------------------------------------------------------------------------
98104-- Helpers
99105-------------------------------------------------------------------------------
100106
101−decodeHM
102− :: (FromJSONKey k, Eq k, Hashable k)
107+decodeHMB
108+ :: (B.FromJSONKey k, Eq k, Hashable k)
103109 => Proxy k -> LBS.ByteString -> Maybe (HM.HashMap k T.Text)
104−decodeHM _ = decode
110+decodeHMB _ = B.decode
111+
112+decodeHMA
113+ :: (A.FromJSON (HM.HashMap k T.Text), Eq k, Hashable k)
114+ => Proxy k -> LBS.ByteString -> Maybe (HM.HashMap k T.Text)
115+decodeHMA _ = A.decode
116+
117+decodeMapB
118+ :: (B.FromJSONKey k, Ord k)
119+ => Proxy k -> LBS.ByteString -> Maybe (M.Map k T.Text)
120+decodeMapB _ = B.decode
105121
106−decodeMap
107− :: (FromJSONKey k, Ord k)
122+decodeMapA
123+ :: (A.FromJSON (M.Map k T.Text), Ord k)
108124 => Proxy k -> LBS.ByteString -> Maybe (M.Map k T.Text)
109−decodeMap _ = decode
125+decodeMapA _ = A.decode
110126
111127proxyText :: Proxy T.Text
112128proxyText = Proxy
@@ -132,14 +148,15 @@ benchDecodeHM
132148 -> LBS.ByteString
133149 -> Benchmark
134150benchDecodeHM name val = bgroup name
135− [ bench "Text" $ nf (decodeHM proxyText) val
136− , bench "Identity" $ nf (decodeHM proxyT1) val
137− , bench "Coerce" $ nf (decodeHM proxyT2) val
138− , bench "Parser" $ nf (decodeHM proxyT3) val
139− , bench "Tagged Text" $ nf (decodeHM $ proxyTagged proxyText) val
140− , bench "Tagged Identity" $ nf (decodeHM $ proxyTagged proxyT1) val
141− , bench "Tagged Coerce" $ nf (decodeHM $ proxyTagged proxyT2) val
142− , bench "Tagged Parser" $ nf (decodeHM $ proxyTagged proxyT3) val
151+ [ bench "Text" $ nf (decodeHMB proxyText) val
152+ , bench "Identity" $ nf (decodeHMB proxyT1) val
153+ , bench "Coerce" $ nf (decodeHMB proxyT2) val
154+ , bench "Parser" $ nf (decodeHMB proxyT3) val
155+ , bench "aeson-0.11" $ nf (decodeHMA proxyText) val
156+ , bench "Tagged Text" $ nf (decodeHMB $ proxyTagged proxyText) val
157+ , bench "Tagged Identity" $ nf (decodeHMB $ proxyTagged proxyT1) val
158+ , bench "Tagged Coerce" $ nf (decodeHMB $ proxyTagged proxyT2) val
159+ , bench "Tagged Parser" $ nf (decodeHMB $ proxyTagged proxyT3) val
143160 ]
144161
145162benchDecodeMap
@@ -147,10 +164,11 @@ benchDecodeMap
147164 -> LBS.ByteString
148165 -> Benchmark
149166benchDecodeMap name val = bgroup name
150− [ bench "Text" $ nf (decodeMap proxyText) val
151− , bench "Identity" $ nf (decodeMap proxyT1) val
152− , bench "Coerce" $ nf (decodeMap proxyT2) val
153− , bench "Parser" $ nf (decodeMap proxyT3) val
167+ [ bench "Text" $ nf (decodeMapB proxyText) val
168+ , bench "Identity" $ nf (decodeMapB proxyT1) val
169+ , bench "Coerce" $ nf (decodeMapB proxyT2) val
170+ , bench "Parser" $ nf (decodeMapB proxyT3) val
171+ , bench "aeson-0.11" $ nf (decodeMapA proxyText) val
154172 ]
155173
156174benchEncodeHM
@@ -158,7 +176,8 @@ benchEncodeHM
158176 -> HM.HashMap T.Text T.Text
159177 -> Benchmark
160178benchEncodeHM name val = bgroup name
161− [ bench "Text" $ nf encode val
179+ [ bench "Text" $ nf B.encode val
180+ , bench "aeson-0.11" $ nf A.encode val
162181 ]
163182
164183benchEncodeMap
@@ -166,7 +185,8 @@ benchEncodeMap
166185 -> HM.HashMap T.Text T.Text
167186 -> Benchmark
168187benchEncodeMap name val = bgroup name
169− [ bench "Text" $ nf encode val'
188+ [ bench "Text" $ nf B.encode val'
189+ , bench "aeson-0.11" $ nf A.encode val'
170190 ]
171191 where
172192 val' :: M.Map T.Text T.Text