Skip to content

Commit ecc0663

Browse files
authored
Merge pull request #605 from Lysxia/benchmark-single-aeson
Add flag for benchmarks to select local or external aeson dependency
2 parents a17a0e8 + 5dcebb3 commit ecc0663

File tree

16 files changed

+220
-524
lines changed

16 files changed

+220
-524
lines changed

benchmarks/AesonFoldable.hs

Lines changed: 13 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
{-# LANGUAGE OverloadedStrings #-}
2-
{-# LANGUAGE PackageImports #-}
32

43
module Main (main) where
54

@@ -9,8 +8,7 @@ import Prelude ()
98
import Prelude.Compat
109

1110
import Data.Foldable (toList)
12-
import qualified "aeson" Data.Aeson as A
13-
import qualified "aeson-benchmarks" Data.Aeson as B
11+
import qualified Data.Aeson as A
1412
import qualified Data.Sequence as S
1513
import qualified Data.Vector as V
1614
import qualified Data.Vector.Unboxed as U
@@ -21,10 +19,6 @@ import qualified Data.Vector.Unboxed as U
2119

2220
newtype L f = L { getL :: f Int }
2321

24-
instance Foldable f => B.ToJSON (L f) where
25-
toJSON = error "do not use this"
26-
toEncoding = B.toEncoding . toList . getL
27-
2822
instance Foldable f => A.ToJSON (L f) where
2923
toJSON = error "do not use this"
3024
toEncoding = A.toEncoding . toList . getL
@@ -35,10 +29,6 @@ instance Foldable f => A.ToJSON (L f) where
3529

3630
newtype F f = F { getF :: f Int }
3731

38-
instance Foldable f => B.ToJSON (F f) where
39-
toJSON = error "do not use this"
40-
toEncoding = B.foldable . getF
41-
4232
instance Foldable f => A.ToJSON (F f) where
4333
toJSON = error "do not use this"
4434
toEncoding = A.foldable . getF
@@ -63,52 +53,34 @@ valueUVector = U.fromList valueList
6353
-- Main
6454
-------------------------------------------------------------------------------
6555

66-
benchEncodeA
56+
benchEncode
6757
:: A.ToJSON a
6858
=> String
6959
-> a
7060
-> Benchmark
71-
benchEncodeA name val
61+
benchEncode name val
7262
= bench ("A " ++ name) $ nf A.encode val
7363

74-
benchEncodeB
75-
:: B.ToJSON a
76-
=> String
77-
-> a
78-
-> Benchmark
79-
benchEncodeB name val
80-
= bench ("B " ++ name) $ nf B.encode val
81-
8264
main :: IO ()
8365
main = defaultMain
8466
[ bgroup "encode"
8567
[ bgroup "List"
86-
[ benchEncodeB "-" valueList
87-
, benchEncodeB "L" $ L valueList
88-
, benchEncodeB "F" $ F valueList
89-
, benchEncodeA "-" valueList
90-
, benchEncodeA "L" $ L valueList
91-
, benchEncodeA "F" $ F valueList
68+
[ benchEncode "-" valueList
69+
, benchEncode "L" $ L valueList
70+
, benchEncode "F" $ F valueList
9271
]
9372
, bgroup "Seq"
94-
[ benchEncodeB "-" valueSeq
95-
, benchEncodeB "L" $ L valueSeq
96-
, benchEncodeB "F" $ F valueSeq
97-
, benchEncodeA "-" valueSeq
98-
, benchEncodeA "L" $ L valueSeq
99-
, benchEncodeA "F" $ F valueSeq
73+
[ benchEncode "-" valueSeq
74+
, benchEncode "L" $ L valueSeq
75+
, benchEncode "F" $ F valueSeq
10076
]
10177
, bgroup "Vector"
102-
[ benchEncodeB "-" valueVector
103-
, benchEncodeB "L" $ L valueVector
104-
, benchEncodeB "F" $ F valueVector
105-
, benchEncodeA "-" valueVector
106-
, benchEncodeA "L" $ L valueVector
107-
, benchEncodeA "F" $ F valueVector
78+
[ benchEncode "-" valueVector
79+
, benchEncode "L" $ L valueVector
80+
, benchEncode "F" $ F valueVector
10881
]
10982
, bgroup "Vector.Unboxed"
110-
[ benchEncodeB "-" valueUVector
111-
, benchEncodeA "-" valueUVector
83+
[ benchEncode "-" valueUVector
11284
]
11385
]
11486
]

benchmarks/AesonMap.hs

Lines changed: 38 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
{-# LANGUAGE FlexibleContexts #-}
2-
{-# LANGUAGE OverloadedStrings #-}
3-
{-# LANGUAGE PackageImports #-}
42
{-# LANGUAGE RankNTypes #-}
53

64
{-# OPTIONS_GHC -fno-warn-orphans #-}
@@ -15,9 +13,8 @@ import Criterion.Main
1513
import Data.Hashable
1614
import Data.Proxy (Proxy (..))
1715
import Data.Tagged (Tagged (..))
18-
import qualified "aeson" Data.Aeson as A
19-
import qualified "aeson-benchmarks" Data.Aeson as B
20-
import qualified "aeson-benchmarks" Data.Aeson.Types as B (fromJSONKeyCoerce)
16+
import Data.Aeson
17+
import Data.Aeson.Types (fromJSONKeyCoerce)
2118
import qualified Data.ByteString.Lazy as LBS
2219
import qualified Data.HashMap.Strict as HM
2320
import qualified Data.Map as M
@@ -47,10 +44,10 @@ instance NFData T1 where
4744
instance Hashable T1 where
4845
hashWithSalt salt (T1 t) = hashWithSalt salt t
4946

50-
instance B.FromJSON T1 where
51-
parseJSON = B.withText "T1" $ pure . T1
52-
instance B.FromJSONKey T1 where
53-
fromJSONKey = B.FromJSONKeyText T1
47+
instance FromJSON T1 where
48+
parseJSON = withText "T1" $ pure . T1
49+
instance FromJSONKey T1 where
50+
fromJSONKey = FromJSONKeyText T1
5451

5552
-------------------------------------------------------------------------------
5653
-- Coerce
@@ -64,10 +61,10 @@ instance NFData T2 where
6461
instance Hashable T2 where
6562
hashWithSalt salt (T2 t) = hashWithSalt salt t
6663

67-
instance B.FromJSON T2 where
68-
parseJSON = B.withText "T2" $ pure . T2
69-
instance B.FromJSONKey T2 where
70-
fromJSONKey = B.fromJSONKeyCoerce
64+
instance FromJSON T2 where
65+
parseJSON = withText "T2" $ pure . T2
66+
instance FromJSONKey T2 where
67+
fromJSONKey = fromJSONKeyCoerce
7168

7269
-------------------------------------------------------------------------------
7370
-- TextParser
@@ -81,10 +78,10 @@ instance NFData T3 where
8178
instance Hashable T3 where
8279
hashWithSalt salt (T3 t) = hashWithSalt salt t
8380

84-
instance B.FromJSON T3 where
85-
parseJSON = B.withText "T3" $ pure . T3
86-
instance B.FromJSONKey T3 where
87-
fromJSONKey = B.FromJSONKeyTextParser (pure . T3)
81+
instance FromJSON T3 where
82+
parseJSON = withText "T3" $ pure . T3
83+
instance FromJSONKey T3 where
84+
fromJSONKey = FromJSONKeyTextParser (pure . T3)
8885

8986
-------------------------------------------------------------------------------
9087
-- Values
@@ -97,40 +94,30 @@ value1000 = value 1000
9794
value10000 = value 10000
9895

9996
encodedValue10 :: LBS.ByteString
100-
encodedValue10 = B.encode value10
97+
encodedValue10 = encode value10
10198

10299
encodedValue100 :: LBS.ByteString
103-
encodedValue100 = B.encode value100
100+
encodedValue100 = encode value100
104101

105102
encodedValue1000 :: LBS.ByteString
106-
encodedValue1000 = B.encode value1000
103+
encodedValue1000 = encode value1000
107104

108105
encodedValue10000 :: LBS.ByteString
109-
encodedValue10000 = B.encode value10000
106+
encodedValue10000 = encode value10000
110107

111108
-------------------------------------------------------------------------------
112109
-- Helpers
113110
-------------------------------------------------------------------------------
114111

115-
decodeHMB
116-
:: (B.FromJSONKey k, Eq k, Hashable k)
112+
decodeHM
113+
:: (FromJSON (HM.HashMap k T.Text), Eq k, Hashable k)
117114
=> Proxy k -> LBS.ByteString -> Maybe (HM.HashMap k T.Text)
118-
decodeHMB _ = B.decode
115+
decodeHM _ = decode
119116

120-
decodeHMA
121-
:: (A.FromJSON (HM.HashMap k T.Text), Eq k, Hashable k)
122-
=> Proxy k -> LBS.ByteString -> Maybe (HM.HashMap k T.Text)
123-
decodeHMA _ = A.decode
124-
125-
decodeMapB
126-
:: (B.FromJSONKey k, Ord k)
127-
=> Proxy k -> LBS.ByteString -> Maybe (M.Map k T.Text)
128-
decodeMapB _ = B.decode
129-
130-
decodeMapA
131-
:: (A.FromJSON (M.Map k T.Text), Ord k)
117+
decodeMap
118+
:: (FromJSON (M.Map k T.Text), Ord k)
132119
=> Proxy k -> LBS.ByteString -> Maybe (M.Map k T.Text)
133-
decodeMapA _ = A.decode
120+
decodeMap _ = decode
134121

135122
proxyText :: Proxy T.Text
136123
proxyText = Proxy
@@ -156,45 +143,41 @@ benchDecodeHM
156143
-> LBS.ByteString
157144
-> Benchmark
158145
benchDecodeHM name val = bgroup name
159-
[ bench "Text" $ nf (decodeHMB proxyText) val
160-
, bench "Identity" $ nf (decodeHMB proxyT1) val
161-
, bench "Coerce" $ nf (decodeHMB proxyT2) val
162-
, bench "Parser" $ nf (decodeHMB proxyT3) val
163-
, bench "aeson-hackage" $ nf (decodeHMA proxyText) val
164-
, bench "Tagged Text" $ nf (decodeHMB $ proxyTagged proxyText) val
165-
, bench "Tagged Identity" $ nf (decodeHMB $ proxyTagged proxyT1) val
166-
, bench "Tagged Coerce" $ nf (decodeHMB $ proxyTagged proxyT2) val
167-
, bench "Tagged Parser" $ nf (decodeHMB $ proxyTagged proxyT3) val
146+
[ bench "Text" $ nf (decodeHM proxyText) val
147+
, bench "Identity" $ nf (decodeHM proxyT1) val
148+
, bench "Coerce" $ nf (decodeHM proxyT2) val
149+
, bench "Parser" $ nf (decodeHM proxyT3) val
150+
, bench "Tagged Text" $ nf (decodeHM $ proxyTagged proxyText) val
151+
, bench "Tagged Identity" $ nf (decodeHM $ proxyTagged proxyT1) val
152+
, bench "Tagged Coerce" $ nf (decodeHM $ proxyTagged proxyT2) val
153+
, bench "Tagged Parser" $ nf (decodeHM $ proxyTagged proxyT3) val
168154
]
169155

170156
benchDecodeMap
171157
:: String
172158
-> LBS.ByteString
173159
-> Benchmark
174160
benchDecodeMap name val = bgroup name
175-
[ bench "Text" $ nf (decodeMapB proxyText) val
176-
, bench "Identity" $ nf (decodeMapB proxyT1) val
177-
, bench "Coerce" $ nf (decodeMapB proxyT2) val
178-
, bench "Parser" $ nf (decodeMapB proxyT3) val
179-
, bench "aeson-hackage" $ nf (decodeMapA proxyText) val
161+
[ bench "Text" $ nf (decodeMap proxyText) val
162+
, bench "Identity" $ nf (decodeMap proxyT1) val
163+
, bench "Coerce" $ nf (decodeMap proxyT2) val
164+
, bench "Parser" $ nf (decodeMap proxyT3) val
180165
]
181166

182167
benchEncodeHM
183168
:: String
184169
-> HM.HashMap T.Text T.Text
185170
-> Benchmark
186171
benchEncodeHM name val = bgroup name
187-
[ bench "Text" $ nf B.encode val
188-
, bench "aeson-0.11" $ nf A.encode val
172+
[ bench "Text" $ nf encode val
189173
]
190174

191175
benchEncodeMap
192176
:: String
193177
-> HM.HashMap T.Text T.Text
194178
-> Benchmark
195179
benchEncodeMap name val = bgroup name
196-
[ bench "Text" $ nf B.encode val'
197-
, bench "aeson-0.11" $ nf A.encode val'
180+
[ bench "Text" $ nf encode val'
198181
]
199182
where
200183
val' :: M.Map T.Text T.Text

benchmarks/AesonParse.hs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
{-# LANGUAGE BangPatterns #-}
22
{-# LANGUAGE OverloadedStrings #-}
3-
{-# LANGUAGE PackageImports #-}
43

54
module Main (main) where
65

76
import Prelude ()
87
import Prelude.Compat
98

10-
import "aeson-benchmarks" Data.Aeson
9+
import Data.Aeson
1110
import Control.Monad
1211
import Data.Attoparsec.ByteString (IResult(..), parseWith)
1312
import Data.Time.Clock

benchmarks/Compare.hs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
{-# LANGUAGE PackageImports #-}
21
{-# LANGUAGE ScopedTypeVariables #-}
32

43
module Main (main) where
@@ -14,7 +13,7 @@ import Data.Json.Builder
1413
import Twitter
1514
import Twitter.Manual ()
1615
import Typed.Common
17-
import qualified "aeson-benchmarks" Data.Aeson as Aeson
16+
import qualified Data.Aeson as Aeson
1817
import qualified Compare.JsonBench as JsonBench
1918

2019
main :: IO ()

benchmarks/CompareWithJSON.hs

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
{-# LANGUAGE PackageImports #-}
21
{-# OPTIONS_GHC -fno-warn-orphans #-}
32

43
module Main (main) where
@@ -11,10 +10,9 @@ import Blaze.ByteString.Builder.Char.Utf8 (fromString)
1110
import Control.DeepSeq (NFData(rnf))
1211
import Criterion.Main
1312
import Data.Maybe (fromMaybe)
14-
import qualified "aeson-benchmarks" Data.Aeson 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
13+
import qualified Data.Aeson as A
14+
import qualified Data.Aeson.Text as A
15+
import qualified Data.Aeson.Parser.Internal as I
1816
import qualified Data.ByteString as BS
1917
import qualified Data.ByteString.Lazy as BL
2018
import qualified Data.Text.Lazy as TL
@@ -39,20 +37,14 @@ decodeJ s =
3937
J.Ok v -> v
4038
J.Error _ -> error "fail to parse via JSON"
4139

42-
decodeA :: BL.ByteString -> A.Value
43-
decodeA s = fromMaybe (error "fail to parse via Aeson") $ A.decode s
40+
decode :: BL.ByteString -> A.Value
41+
decode s = fromMaybe (error "fail to parse via Aeson") $ A.decode s
4442

45-
decodeA' :: BL.ByteString -> A.Value
46-
decodeA' s = fromMaybe (error "fail to parse via Aeson") $ A.decode' s
43+
decode' :: BL.ByteString -> A.Value
44+
decode' s = fromMaybe (error "fail to parse via Aeson") $ A.decode' s
4745

48-
decodeAS :: BS.ByteString -> A.Value
49-
decodeAS s = fromMaybe (error "fail to parse via Aeson") $ A.decodeStrict' s
50-
51-
decodeB :: BL.ByteString -> B.Value
52-
decodeB s = fromMaybe (error "fail to parse via Aeson") $ B.decode s
53-
54-
decodeBS :: BS.ByteString -> B.Value
55-
decodeBS s = fromMaybe (error "fail to parse via Aeson") $ B.decodeStrict' s
46+
decodeS :: BS.ByteString -> A.Value
47+
decodeS s = fromMaybe (error "fail to parse via Aeson") $ A.decodeStrict' s
5648

5749
decodeIP :: BL.ByteString -> A.Value
5850
decodeIP s = fromMaybe (error "fail to parse via Parser.decodeWith") $
@@ -80,32 +72,29 @@ main = do
8072
defaultMain [
8173
bgroup "decode" [
8274
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
75+
bench "aeson/lazy" $ nf decode enA
76+
, bench "aeson/strict" $ nf decode' enA
77+
, bench "aeson/stricter" $ nf decodeS enS
8878
, bench "aeson/parser" $ nf decodeIP enA
8979
, bench "json" $ nf decodeJ enJ
9080
]
9181
, bgroup "jp" [
92-
bench "aeson" $ nf decodeA jpA
93-
, bench "aeson/stricter" $ nf decodeAS jpS
94-
, bench "aeson/hackage" $ nf decodeB jpA
82+
bench "aeson" $ nf decode jpA
83+
, bench "aeson/stricter" $ nf decodeS jpS
9584
, bench "json" $ nf decodeJ jpJ
9685
]
9786
]
9887
, bgroup "encode" [
9988
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)
89+
bench "aeson-to-bytestring" $ nf A.encode (decode enA)
90+
, bench "aeson-via-text-to-bytestring" $ nf encodeViaText (decode enA)
91+
, bench "aeson-to-text" $ nf encodeToText (decode enA)
10392
, bench "json" $ nf encodeJ (decodeJ enJ)
10493
]
10594
, 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)
95+
bench "aeson-to-bytestring" $ nf A.encode (decode jpA)
96+
, bench "aeson-via-text-to-bytestring" $ nf encodeViaText (decode jpA)
97+
, bench "aeson-to-text" $ nf encodeToText (decode jpA)
10998
, bench "json" $ nf encodeJ (decodeJ jpJ)
11099
]
111100
]

0 commit comments

Comments
 (0)