packages feed

winery-0.1: benchmarks/bench.hs

{-# LANGUAGE DeriveGeneric, OverloadedStrings, ScopedTypeVariables #-}
import Control.DeepSeq
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString as B
import qualified Data.Binary as B
import Data.Either
import Data.Winery
import Data.Word
import Data.Text (Text)
import qualified Data.Vector as V
import GHC.Generics (Generic)
import Gauge.Main
import qualified Codec.Serialise as CBOR
import qualified Data.Csv as CSV
import Data.Winery.Term

data Gender = Male | Female deriving (Show, Generic)

instance Serialise Gender
instance CBOR.Serialise Gender
instance B.Binary Gender

data TestRec = TestRec
  { id_ :: !Int
  , first_name :: !Text
  , last_name :: !Text
  , email :: !Text
  , gender :: !Gender
  , num :: !Int
  , latitude :: !Double
  , longitude :: !Double
  } deriving (Show, Generic)

instance NFData TestRec where
  rnf TestRec{} = ()

instance Serialise TestRec where
  schemaVia = gschemaViaRecord
  toEncoding = gtoEncodingRecord
  deserialiser = gdeserialiserRecord Nothing

instance B.Binary TestRec
instance CBOR.Serialise TestRec

main = do
  winery <- B.readFile "benchmarks/data.winery"
  binary <- B.readFile "benchmarks/data.binary"
  cbor <- B.readFile "benchmarks/data.cbor"
  Right (values :: [TestRec]) <- return $ deserialise winery
  defaultMain
    [ bgroup "serialise"
      [ bench "winery" $ nf serialise values
      , bench "binary" $ nf (BL.toStrict . B.encode) values
      , bench "serialise" $ nf (BL.toStrict . CBOR.serialise) values
      ]
    , bgroup "deserialise"
      [ bench "winery" $ nf (fromRight undefined . deserialise :: B.ByteString -> [TestRec]) winery
      , bench "binary" $ nf (B.decode . BL.fromStrict :: B.ByteString -> [TestRec]) binary
      , bench "serialise" $ nf (CBOR.deserialise . BL.fromStrict :: B.ByteString -> [TestRec]) cbor
      ]
    ]