{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} module Main (main) where import Control.DeepSeq (NFData) import Criterion.Main (bench, bgroup, defaultMain, nf) import Data.Binary (Binary, decode, encode) import Data.Binary.Instances () import Data.Typeable (Typeable) import GHC.Generics (Generic) import qualified Data.ByteString.Lazy as LBS import qualified Data.HashMap.Strict as HM import qualified Data.Text as T import Data.Binary.Tagged data Field = Field { _fieldName :: T.Text , _fieldValue :: Int } deriving (Eq, Show, Generic, Typeable) instance Binary Field instance NFData Field instance Structured Field data Record = Record { _recordFields :: HM.HashMap T.Text Field , _recordEnabled :: Bool } deriving (Eq, Show, Generic, Typeable) instance Binary Record instance NFData Record instance Structured Record record :: Record record = Record fields enabled where fields = HM.fromList (fmap mkField [1..1000]) mkField i = let name = T.pack (show i) in (name, Field name i) enabled = True encodedRecord :: LBS.ByteString encodedRecord = encode record taggedEncodedRecord :: LBS.ByteString taggedEncodedRecord = structuredEncode record main :: IO () main = defaultMain [ bgroup "encode" [ bench "Binary" $ nf encode record , bench "Tagged" $ nf structuredEncode record ] , bgroup "decode" [ bench "Binary" $ nf (decode :: LBS.ByteString -> Record) encodedRecord , bench "Tagged" $ nf (structuredDecode :: LBS.ByteString -> Record) taggedEncodedRecord ] ]