1{-# LANGUAGE FlexibleContexts #-}
2{-# LANGUAGE OverloadedStrings #-}
3{-# LANGUAGE PackageImports #-}
4{-# LANGUAGE RankNTypes #-}
6{-# OPTIONS_GHC -fno-warn-orphans #-}
8module Main (main) where
16import Data.Proxy (Proxy (..))
17import Data.Tagged (Tagged (..))
18import qualified "aeson" Data.Aeson as A
19import qualified "aeson-benchmarks" Data.Aeson as B
20import qualified "aeson-benchmarks" Data.Aeson.Types as B (fromJSONKeyCoerce)
21import qualified Data.ByteString.Lazy as LBS
22import qualified Data.HashMap.Strict as HM
23import qualified Data.Map as M
24import qualified Data.Text as T
26value :: Int -> HM.HashMap T.Text T.Text
27value n = HM.fromList $ map f [1..n]
29 f m = let t = T.pack (show m) in (t, t)
31-------------------------------------------------------------------------------
33-------------------------------------------------------------------------------
35instance Hashable b => Hashable (Tagged a b) where
36 hashWithSalt salt (Tagged a) = hashWithSalt salt a
38-------------------------------------------------------------------------------
40-------------------------------------------------------------------------------
45instance NFData T1 where
47instance Hashable T1 where
48 hashWithSalt salt (T1 t) = hashWithSalt salt t
50instance B.FromJSON T1 where
51 parseJSON = B.withText "T1" $ pure . T1
52instance B.FromJSONKey T1 where
53 fromJSONKey = B.FromJSONKeyText T1
55-------------------------------------------------------------------------------
57-------------------------------------------------------------------------------
62instance NFData T2 where
64instance Hashable T2 where
65 hashWithSalt salt (T2 t) = hashWithSalt salt t
67instance B.FromJSON T2 where
68 parseJSON = B.withText "T2" $ pure . T2
69instance B.FromJSONKey T2 where
70 fromJSONKey = B.fromJSONKeyCoerce
72-------------------------------------------------------------------------------
74-------------------------------------------------------------------------------
79instance NFData T3 where
81instance Hashable T3 where
82 hashWithSalt salt (T3 t) = hashWithSalt salt t
84instance B.FromJSON T3 where
85 parseJSON = B.withText "T3" $ pure . T3
86instance B.FromJSONKey T3 where
87 fromJSONKey = B.FromJSONKeyTextParser (pure . T3)
89-------------------------------------------------------------------------------
91-------------------------------------------------------------------------------
93value10, value100, value1000, value10000 :: HM.HashMap T.Text T.Text
97value10000 = value 10000
99encodedValue10 :: LBS.ByteString
100encodedValue10 = B.encode value10
102encodedValue100 :: LBS.ByteString
103encodedValue100 = B.encode value100
105encodedValue1000 :: LBS.ByteString
106encodedValue1000 = B.encode value1000
108encodedValue10000 :: LBS.ByteString
109encodedValue10000 = B.encode value10000
111-------------------------------------------------------------------------------
113-------------------------------------------------------------------------------
116 :: (B.FromJSONKey k, Eq k, Hashable k)
117 => Proxy k -> LBS.ByteString -> Maybe (HM.HashMap k T.Text)
118decodeHMB _ = B.decode
121 :: (A.FromJSON (HM.HashMap k T.Text), Eq k, Hashable k)
122 => Proxy k -> LBS.ByteString -> Maybe (HM.HashMap k T.Text)
123decodeHMA _ = A.decode
126 :: (B.FromJSONKey k, Ord k)
127 => Proxy k -> LBS.ByteString -> Maybe (M.Map k T.Text)
128decodeMapB _ = B.decode
131 :: (A.FromJSON (M.Map k T.Text), Ord k)
132 => Proxy k -> LBS.ByteString -> Maybe (M.Map k T.Text)
133decodeMapA _ = A.decode
135proxyText :: Proxy T.Text
147proxyTagged :: Proxy a -> Proxy (Tagged () a)
150-------------------------------------------------------------------------------
152-------------------------------------------------------------------------------
158benchDecodeHM 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
174benchDecodeMap 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
184 -> HM.HashMap T.Text T.Text
186benchEncodeHM name val = bgroup name
187 [ bench "Text" $ nf B.encode val
188 , bench "aeson-0.11" $ nf A.encode val
193 -> HM.HashMap T.Text T.Text
195benchEncodeMap name val = bgroup name
196 [ bench "Text" $ nf B.encode val'
197 , bench "aeson-0.11" $ nf A.encode val'
200 val' :: M.Map T.Text T.Text
201 val' = M.fromList . HM.toList $ val
207 [ benchDecodeHM "10" encodedValue10
208 , benchDecodeHM "100" encodedValue100
209 , benchDecodeHM "1000" encodedValue1000
210 , benchDecodeHM "10000" encodedValue10000
213 [ benchDecodeMap "10" encodedValue10
214 , benchDecodeMap "100" encodedValue100
215 , benchDecodeMap "1000" encodedValue1000
216 , benchDecodeMap "10000" encodedValue10000
221 [ benchEncodeHM "100" value100
222 , benchEncodeHM "1000" value1000
223 , benchEncodeHM "10000" value10000
226 [ benchEncodeMap "100" value100
227 , benchEncodeMap "1000" value1000
228 , benchEncodeMap "10000" value10000
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list