on 1.2.0.0 help sign in
typeable/aeson/benchmarks/AesonFoldable.hs
114 lines 3.3 kB history raw
1{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE PackageImports #-}
4module Main (main) where
6import Criterion.Main
8import Prelude ()
9import Prelude.Compat
11import Data.Foldable (toList)
12import qualified "aeson" Data.Aeson as A
13import qualified "aeson-benchmarks" Data.Aeson as B
14import qualified Data.Sequence as S
15import qualified Data.Vector as V
16import qualified Data.Vector.Unboxed as U
18-------------------------------------------------------------------------------
19-- List
20-------------------------------------------------------------------------------
22newtype L f = L { getL :: f Int }
24instance Foldable f => B.ToJSON (L f) where
25 toJSON = error "do not use this"
26 toEncoding = B.toEncoding . toList . getL
28instance Foldable f => A.ToJSON (L f) where
29 toJSON = error "do not use this"
30 toEncoding = A.toEncoding . toList . getL
32-------------------------------------------------------------------------------
33-- Foldable
34-------------------------------------------------------------------------------
36newtype F f = F { getF :: f Int }
38instance Foldable f => B.ToJSON (F f) where
39 toJSON = error "do not use this"
40 toEncoding = B.foldable . getF
42instance Foldable f => A.ToJSON (F f) where
43 toJSON = error "do not use this"
44 toEncoding = A.foldable . getF
46-------------------------------------------------------------------------------
47-- Values
48-------------------------------------------------------------------------------
50valueList :: [Int]
51valueList = [1..1000]
53valueSeq :: S.Seq Int
54valueSeq = S.fromList valueList
56valueVector :: V.Vector Int
57valueVector = V.fromList valueList
59valueUVector :: U.Vector Int
60valueUVector = U.fromList valueList
62-------------------------------------------------------------------------------
63-- Main
64-------------------------------------------------------------------------------
66benchEncodeA
67 :: A.ToJSON a
68 => String
69 -> a
70 -> Benchmark
71benchEncodeA name val
72 = bench ("A " ++ name) $ nf A.encode val
74benchEncodeB
75 :: B.ToJSON a
76 => String
77 -> a
78 -> Benchmark
79benchEncodeB name val
80 = bench ("B " ++ name) $ nf B.encode val
82main :: IO ()
83main = defaultMain
84 [ bgroup "encode"
85 [ 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
92 ]
93 , 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
100 ]
101 , 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
108 ]
109 , bgroup "Vector.Unboxed"
110 [ benchEncodeB "-" valueUVector
111 , benchEncodeA "-" valueUVector
112 ]
113 ]
114 ]