on master help sign in
Merge pull request #431 from phadej/foldable-encode-benchmark

Add encode/foldable benchmark

commit68bb89f0c58796fdd6d2c136c9ea3ef9b70b8685 authorAdam Bergmark <adam@bergmark.nl> dateTue 14 Jun 2016, 11:39 (10 years ago) parentef5f2c7ba46095
3 files changed+97−2
.gitignore+1 benchmarks/AesonFoldable.hs+80 benchmarks/aeson-benchmarks.cabal+16−2
.gitignore+1
@@ -1,6 +1,7 @@
11dist
22.cabal-sandbox/
33cabal.sandbox.config
4+.stack-work/
45
56*.o
67*.hi
benchmarks/AesonFoldable.hsnew file+80
@@ -0,0 +1,80 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+import Criterion.Main
3+import Data.Aeson
4+import Data.Foldable (toList)
5+
6+import qualified Data.Sequence as S
7+import qualified Data.Vector as V
8+import qualified Data.Vector.Unboxed as U
9+
10+-------------------------------------------------------------------------------
11+-- List
12+-------------------------------------------------------------------------------
13+
14+newtype L f = L { getL :: f Int }
15+
16+instance Foldable f => ToJSON (L f) where
17+ toJSON = error "do not use this"
18+ toEncoding = toEncoding . toList . getL
19+
20+-------------------------------------------------------------------------------
21+-- Foldable
22+-------------------------------------------------------------------------------
23+
24+newtype F f = F { getF :: f Int }
25+
26+instance Foldable f => ToJSON (F f) where
27+ toJSON = error "do not use this"
28+ toEncoding = foldable . getF
29+
30+-------------------------------------------------------------------------------
31+-- Values
32+-------------------------------------------------------------------------------
33+
34+valueList :: [Int]
35+valueList = [1..1000]
36+
37+valueSeq :: S.Seq Int
38+valueSeq = S.fromList valueList
39+
40+valueVector :: V.Vector Int
41+valueVector = V.fromList valueList
42+
43+valueUVector :: U.Vector Int
44+valueUVector = U.fromList valueList
45+
46+-------------------------------------------------------------------------------
47+-- Main
48+-------------------------------------------------------------------------------
49+
50+benchEncode
51+ :: ToJSON a
52+ => String
53+ -> a
54+ -> Benchmark
55+benchEncode name val
56+ = bench name $ nf encode val
57+
58+main :: IO ()
59+main = defaultMain
60+ [ bgroup "encode"
61+ [ bgroup "List"
62+ [ benchEncode "-" valueList
63+ , benchEncode "L" $ L valueList
64+ , benchEncode "F" $ F valueList
65+ ]
66+ , bgroup "Seq"
67+ [ benchEncode "-" valueSeq
68+ , benchEncode "L" $ L valueSeq
69+ , benchEncode "F" $ F valueSeq
70+ ]
71+ , bgroup "Vector"
72+ [ benchEncode "-" valueVector
73+ , benchEncode "L" $ L valueVector
74+ , benchEncode "F" $ F valueVector
75+ ]
76+ , bgroup "Vector.Unboxed"
77+ [ benchEncode "-" valueUVector
78+ ]
79+ ]
80+ ]
benchmarks/aeson-benchmarks.cabal+16−2
@@ -174,6 +174,20 @@ executable aeson-benchmark-map
174174 hashable,
175175 tagged,
176176 text,
177− transformers,
178− transformers-compat,
179177 unordered-containers
178+
179+executable aeson-benchmark-foldable
180+ main-is: AesonFoldable.hs
181+ ghc-options: -Wall -O2 -rtsopts
182+ build-depends:
183+ aeson-benchmarks,
184+ base,
185+ criterion >= 1.0,
186+ bytestring,
187+ containers,
188+ deepseq,
189+ hashable,
190+ tagged,
191+ text,
192+ unordered-containers,
193+ vector