winery-0.2: 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
import System.Directory
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"
values :: [TestRec] <- return $ B.decode $ BL.fromStrict binary
let aValue = head values
temp <- getTemporaryDirectory
defaultMain
[ bgroup "serialise/list"
[ bench "winery" $ nf serialiseOnly values
, bench "binary" $ nf (BL.toStrict . B.encode) values
, bench "serialise" $ nf (BL.toStrict . CBOR.serialise) values
]
, bgroup "serialise/item"
[ bench "winery" $ nf serialiseOnly aValue
, bench "binary" $ nf (BL.toStrict . B.encode) aValue
, bench "serialise" $ nf (BL.toStrict . CBOR.serialise) aValue
]
, bgroup "serialise/file"
[ bench "winery" $ whnfIO $ writeFileSerialise (temp ++ "/data.winery") values
, bench "binary" $ whnfIO $ B.encodeFile (temp ++ "/data.binary") values
, bench "serialise" $ whnfIO $ CBOR.writeFileSerialise (temp ++ "/data.cbor") 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
]
]