Skip to content

Commit

Permalink
Add benchmarks
Browse files Browse the repository at this point in the history
  • Loading branch information
phadej committed Jan 25, 2016
1 parent 043e570 commit 5d366a8
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 0 deletions.
89 changes: 89 additions & 0 deletions benchmarks/AesonMap.hs
@@ -0,0 +1,89 @@
{-# LANGUAGE BangPatterns, OverloadedStrings, FlexibleInstances, MultiParamTypeClasses #-}

import Control.DeepSeq
import Criterion.Main
import Data.Aeson
import Data.Aeson.Types (JSONKeyCoerce(..), Parser)
import Data.Hashable
import qualified Data.ByteString.Lazy as LBS
import qualified Data.Text as T
import qualified Data.HashMap.Strict as HM
import Data.Functor.Identity

value :: Int -> HM.HashMap T.Text T.Text
value n = HM.fromList $ map f [1..n]
where
f m = let t = T.pack (show m) in (t, t)

newtype T1 = T1 T.Text
deriving Eq

instance NFData T1 where
rnf (T1 t) = rnf t
instance Hashable T1 where
hashWithSalt salt (T1 t) = hashWithSalt salt t
instance FromJSONKey T1 Identity where
fromJSONKey = Identity . T1

newtype T2 = T2 T.Text
deriving Eq

instance NFData T2 where
rnf (T2 t) = rnf t
instance Hashable T2 where
hashWithSalt salt (T2 t) = hashWithSalt salt t
instance FromJSONKey T2 JSONKeyCoerce where
fromJSONKey _ = JSONKeyCoerce

newtype T3 = T3 T.Text
deriving Eq

instance NFData T3 where
rnf (T3 t) = rnf t
instance Hashable T3 where
hashWithSalt salt (T3 t) = hashWithSalt salt t
instance FromJSONKey T3 Parser where
fromJSONKey = return . T3

encodedValue10 :: LBS.ByteString
encodedValue10 = encode $ value 10

encodedValue100 :: LBS.ByteString
encodedValue100 = encode $ value 100

encodedValue1000 :: LBS.ByteString
encodedValue1000 = encode $ value 1000

encodedValue100000 :: LBS.ByteString
encodedValue100000 = encode $ value 100000

main :: IO ()
main = do
defaultMain
[ bgroup "HashMap"
[ bgroup "10"
[ bench "Text" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T.Text T.Text)) encodedValue10
, bench "Identity" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T1 T.Text)) encodedValue10
, bench "Coerce" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T2 T.Text)) encodedValue10
, bench "Parser" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T3 T.Text)) encodedValue10
]
, bgroup "100"
[ bench "Text" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T.Text T.Text)) encodedValue100
, bench "Identity" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T1 T.Text)) encodedValue100
, bench "Coerce" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T2 T.Text)) encodedValue100
, bench "Parser" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T3 T.Text)) encodedValue100
]
, bgroup "1000"
[ bench "Text" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T.Text T.Text)) encodedValue1000
, bench "Identity" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T1 T.Text)) encodedValue1000
, bench "Coerce" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T2 T.Text)) encodedValue1000
, bench "Parser" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T3 T.Text)) encodedValue1000
]
, bgroup "100000"
[ bench "Text" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T.Text T.Text)) encodedValue100000
, bench "Identity" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T1 T.Text)) encodedValue100000
, bench "Coerce" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T2 T.Text)) encodedValue100000
, bench "Parser" $ nf (decode :: LBS.ByteString -> Maybe (HM.HashMap T3 T.Text)) encodedValue100000
]
]
]
23 changes: 23 additions & 0 deletions benchmarks/aeson-benchmarks.cabal
Expand Up @@ -38,6 +38,7 @@ library
containers,
deepseq,
dlist >= 0.2,
fail == 4.9.*,
ghc-prim >= 0.2,
hashable >= 1.1.2.0,
mtl,
Expand All @@ -50,6 +51,13 @@ library
unordered-containers >= 0.2.3.0,
vector >= 0.7.1

if impl(ghc >=7.8)
cpp-options: -DHAS_COERCIBLE

if !impl(ghc >= 8.0)
-- `Data.Semigroup` is available in base only since GHC 8.0
build-depends: semigroups >= 0.16.1

if flag(old-locale)
build-depends: time < 1.5, old-locale
else
Expand Down Expand Up @@ -156,3 +164,18 @@ executable aeson-benchmark-dates
aeson-benchmarks,
text,
time

executable aeson-benchmark-map
main-is: AesonMap.hs
ghc-options: -Wall -O2 -rtsopts
build-depends:
aeson-benchmarks,
base,
criterion >= 1.0,
bytestring,
deepseq,
hashable,
text,
transformers,
transformers-compat,
unordered-containers

0 comments on commit 5d366a8

Please sign in to comment.