on master help sign in
Merge pull request #447 from phadej/old-version-bench

Old version bench

commit54592738bdaa2917b4d0f409d937be6419441b70 authorAdam Bergmark <adam@bergmark.nl> dateWed 13 Jul 2016, 23:11 (10 years ago) parent987941b763b691
6 files changed+121−62
.travis.yml+1−1 Data/Aeson/Types/ToJSON.hs+2−2 benchmarks/AesonFoldable.hs+49−20 benchmarks/AesonMap.hs+59−39 benchmarks/aeson-benchmarks.cabal+2 stack-bench.yaml+8
.travis.yml+1−1
@@ -34,7 +34,7 @@ matrix:
3434 - env: BUILD=cabal CABALVER=1.24 GHCVER=8.0.1
3535 compiler: ": #GHC 8.0.1"
3636 addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.1], sources: [hvr-ghc]}}
37− - env: BUILD=stack CABALVER=1.22 GHCVER=7.10.3
37+ - env: BUILD=stack CABALVER=1.22 GHCVER=7.10.3 STACK_YAML=stack-bench.yaml
3838 compiler: ": #GHC 7.10.3"
3939 addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.3], sources: [hvr-ghc]}}
4040
Data/Aeson/Types/ToJSON.hs+2−2
@@ -1870,10 +1870,10 @@ instance ToJSON1 Vector where
18701870 {-# INLINE liftToEncoding #-}
18711871
18721872instance (ToJSON a) => ToJSON (Vector a) where
1873− toJSON = Array . V.map toJSON
1873+ toJSON = toJSON1
18741874 {-# INLINE toJSON #-}
18751875
1876− toEncoding = encodeVector
1876+ toEncoding = toEncoding1
18771877 {-# INLINE toEncoding #-}
18781878
18791879encodeVector :: (ToJSON a, VG.Vector v a) => v a -> Encoding
benchmarks/AesonFoldable.hs+49−20
@@ -1,6 +1,9 @@
1−{-# LANGUAGE OverloadedStrings #-}
1+{-# LANGUAGE OverloadedStrings, PackageImports #-}
22import Criterion.Main
3−import Data.Aeson
3+
4+import qualified "aeson" Data.Aeson as A
5+import qualified "aeson-benchmarks" Data.Aeson as B
6+
47import Data.Foldable (toList)
58
69import qualified Data.Sequence as S
@@ -13,9 +16,13 @@ import qualified Data.Vector.Unboxed as U
1316
1417newtype L f = L { getL :: f Int }
1518
16−instance Foldable f => ToJSON (L f) where
19+instance Foldable f => B.ToJSON (L f) where
1720 toJSON = error "do not use this"
18− toEncoding = toEncoding . toList . getL
21+ toEncoding = B.toEncoding . toList . getL
22+
23+instance Foldable f => A.ToJSON (L f) where
24+ toJSON = error "do not use this"
25+ toEncoding = A.toEncoding . toList . getL
1926
2027-------------------------------------------------------------------------------
2128-- Foldable
@@ -23,9 +30,13 @@ instance Foldable f => ToJSON (L f) where
2330
2431newtype F f = F { getF :: f Int }
2532
26−instance Foldable f => ToJSON (F f) where
33+instance Foldable f => B.ToJSON (F f) where
34+ toJSON = error "do not use this"
35+ toEncoding = B.foldable . getF
36+
37+instance Foldable f => A.ToJSON (F f) where
2738 toJSON = error "do not use this"
28− toEncoding = foldable . getF
39+ toEncoding = A.foldable . getF
2940
3041-------------------------------------------------------------------------------
3142-- Values
@@ -47,34 +58,52 @@ valueUVector = U.fromList valueList
4758-- Main
4859-------------------------------------------------------------------------------
4960
50−benchEncode
51− :: ToJSON a
61+benchEncodeA
62+ :: A.ToJSON a
63+ => String
64+ -> a
65+ -> Benchmark
66+benchEncodeA name val
67+ = bench ("A " ++ name) $ nf A.encode val
68+
69+benchEncodeB
70+ :: B.ToJSON a
5271 => String
5372 -> a
5473 -> Benchmark
55−benchEncode name val
56− = bench name $ nf encode val
74+benchEncodeB name val
75+ = bench ("B " ++ name) $ nf B.encode val
5776
5877main :: IO ()
5978main = defaultMain
6079 [ bgroup "encode"
6180 [ bgroup "List"
62− [ benchEncode "-" valueList
63− , benchEncode "L" $ L valueList
64− , benchEncode "F" $ F valueList
81+ [ benchEncodeB "-" valueList
82+ , benchEncodeB "L" $ L valueList
83+ , benchEncodeB "F" $ F valueList
84+ , benchEncodeA "-" valueList
85+ , benchEncodeA "L" $ L valueList
86+ , benchEncodeA "F" $ F valueList
6587 ]
6688 , bgroup "Seq"
67− [ benchEncode "-" valueSeq
68− , benchEncode "L" $ L valueSeq
69− , benchEncode "F" $ F valueSeq
89+ [ benchEncodeB "-" valueSeq
90+ , benchEncodeB "L" $ L valueSeq
91+ , benchEncodeB "F" $ F valueSeq
92+ , benchEncodeA "-" valueSeq
93+ , benchEncodeA "L" $ L valueSeq
94+ , benchEncodeA "F" $ F valueSeq
7095 ]
7196 , bgroup "Vector"
72− [ benchEncode "-" valueVector
73− , benchEncode "L" $ L valueVector
74− , benchEncode "F" $ F valueVector
97+ [ benchEncodeB "-" valueVector
98+ , benchEncodeB "L" $ L valueVector
99+ , benchEncodeB "F" $ F valueVector
100+ , benchEncodeA "-" valueVector
101+ , benchEncodeA "L" $ L valueVector
102+ , benchEncodeA "F" $ F valueVector
75103 ]
76104 , bgroup "Vector.Unboxed"
77− [ benchEncode "-" valueUVector
105+ [ benchEncodeB "-" valueUVector
106+ , benchEncodeA "-" valueUVector
78107 ]
79108 ]
80109 ]
benchmarks/AesonMap.hs+59−39
@@ -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
benchmarks/aeson-benchmarks.cabal+2
@@ -180,6 +180,7 @@ executable aeson-benchmark-map
180180 main-is: AesonMap.hs
181181 ghc-options: -Wall -O2 -rtsopts
182182 build-depends:
183+ aeson == 0.11.*,
183184 aeson-benchmarks,
184185 base,
185186 criterion >= 1.0,
@@ -195,6 +196,7 @@ executable aeson-benchmark-foldable
195196 main-is: AesonFoldable.hs
196197 ghc-options: -Wall -O2 -rtsopts
197198 build-depends:
199+ aeson,
198200 aeson-benchmarks,
199201 base,
200202 criterion >= 1.0,
stack-bench.yamlnew file+8
@@ -0,0 +1,8 @@
1+resolver: lts-6.5
2+packages:
3+- benchmarks
4+extra-deps:
5+- semigroups-0.18.2
6+flags:
7+ semigroups:
8+ bytestring-builder: false