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
]
]