@@ -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+ ]