{-# Language GADTs, ScopedTypeVariables #-}
module Main where
import Data.Bond
import Benchmark.Intvec
import Unittest.Compat.Compat
import Control.Applicative
import Criterion.Main
import Data.Proxy
import Data.Word
import System.FilePath
import Prelude -- workaround for Control.Applicative in ghc 7.10
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BL
import qualified Data.Vector as V
compatDataPath :: String
compatDataPath = "test" </> "compat" </> "data"
data ProtoWrapper = forall t. BondProto t => ProtoWrapper String t FilePath
| forall t. BondTaggedProto t => TaggedProtoWrapper String t FilePath
fromTagged :: ProtoWrapper -> ProtoWrapper
fromTagged (TaggedProtoWrapper n t dat) = ProtoWrapper n t dat
fromTagged w = w
taggedProtocols :: [ProtoWrapper]
taggedProtocols =
[ TaggedProtoWrapper "CompactBinary" CompactBinaryProto "compat.compact2.dat"
, TaggedProtoWrapper "CompactBinary v1" CompactBinaryV1Proto "compat.compact.dat"
, TaggedProtoWrapper "FastBinary" FastBinaryProto "compat.fast.dat"
]
simpleProtocols :: [ProtoWrapper]
simpleProtocols =
[ ProtoWrapper "SimpleBinary" SimpleBinaryProto "compat.simple2.dat"
, ProtoWrapper "SimpleBinary v1" SimpleBinaryV1Proto "compat.simple.dat"
]
main :: IO ()
main = defaultMain
[ bgroup "bondRead" $ map benchRead (simpleProtocols ++ taggedProtocols)
, bgroup "bondReadTagged" $ map benchReadTagged taggedProtocols
, bgroup "bondReadWithSchema" $ map benchReadSchema (simpleProtocols ++ taggedProtocols)
, bgroup "bondWrite" $ map benchWrite (simpleProtocols ++ taggedProtocols)
, bgroup "bondWriteTagged" $ map benchWriteTagged taggedProtocols
, bgroup "bondWriteWithSchema" $ map benchWriteSchema (simpleProtocols ++ taggedProtocols)
, bgroup "VarInt"
[ bgroup "Read"
[ intRead "1" $ take 10000 $ cycle [0 .. 127]
, intRead "2" $ take 10000 $ cycle [128 .. 16383]
, intRead "3" $ take 10000 $ cycle [16384 .. 2097151]
, intRead "4" $ take 10000 $ cycle [2097152 .. 268435455]
, intRead "5" $ take 10000 $ cycle [268435456 .. 34359738367]
, intRead "6" $ take 10000 $ cycle [34359738368 .. 4398046511103]
, intRead "7" $ take 10000 $ cycle [4398046511104 .. 562949953421311]
, intRead "8" $ take 10000 $ cycle [562949953421312 .. 72057594037927935]
, intRead "9" $ take 10000 $ cycle [72057594037927936 .. 9223372036854775807]
, intRead "10" $ take 10000 $ cycle [9223372036854775808 .. maxBound]
]
, bgroup "Write"
[ intWrite "1" $ take 10000 $ cycle [0 .. 127]
, intWrite "2" $ take 10000 $ cycle [128 .. 16383]
, intWrite "3" $ take 10000 $ cycle [16384 .. 2097151]
, intWrite "4" $ take 10000 $ cycle [2097152 .. 268435455]
, intWrite "5" $ take 10000 $ cycle [268435456 .. 34359738367]
, intWrite "6" $ take 10000 $ cycle [34359738368 .. 4398046511103]
, intWrite "7" $ take 10000 $ cycle [4398046511104 .. 562949953421311]
, intWrite "8" $ take 10000 $ cycle [562949953421312 .. 72057594037927935]
, intWrite "9" $ take 10000 $ cycle [72057594037927936 .. 9223372036854775807]
, intWrite "10" $ take 10000 $ cycle [9223372036854775808 .. maxBound]
]
]
]
intRead :: String -> [Word64] -> Benchmark
intRead name xs = env
makeStream
(bench name . nf (bondRead CompactBinaryProto :: BL.ByteString -> Either String Intvec))
where
makeStream = do
let v = defaultValue { ints = V.fromList xs }
let Right stream = bondWrite CompactBinaryProto v
return stream
intWrite :: String -> [Word64] -> Benchmark
intWrite name xs = env
(return defaultValue { ints = V.fromList xs })
(bench name . nf (bondWrite CompactBinaryProto))
benchRead :: ProtoWrapper -> Benchmark
benchRead (ProtoWrapper n t dat) =
env (BL.fromStrict <$> BS.readFile (compatDataPath </> dat))
(bench n . nf (bondRead t :: BL.ByteString -> Either String Compat))
benchRead p = benchRead (fromTagged p)
benchReadTagged :: ProtoWrapper -> Benchmark
benchReadTagged (TaggedProtoWrapper n t dat) =
env (BL.fromStrict <$> BS.readFile (compatDataPath </> dat))
(bench n . nf (bondReadTagged t))
benchReadTagged _ = error "wrong type"
benchReadSchema :: ProtoWrapper -> Benchmark
benchReadSchema (ProtoWrapper n t dat) =
let schema = getSchema (Proxy :: Proxy Compat)
in env (do
stream <- BL.fromStrict <$> BS.readFile (compatDataPath </> dat)
-- run decoding once to expand schema
return (bondReadWithSchema t schema stream `seq` stream)
)
(bench n . nf (bondReadWithSchema t schema))
benchReadSchema p = benchReadSchema (fromTagged p)
benchWrite :: ProtoWrapper -> Benchmark
benchWrite (ProtoWrapper n t dat) =
env getCompat
(bench n . nf (bondWrite t))
where
getCompat :: IO Compat
getCompat = do
stream <- BL.readFile (compatDataPath </> dat)
let Right val = bondRead t stream
return val
benchWrite p = benchWrite (fromTagged p)
benchWriteTagged :: ProtoWrapper -> Benchmark
benchWriteTagged (TaggedProtoWrapper n t dat) =
env getStruct
(bench n . nf (bondWriteTagged t))
where
getStruct = do
stream <- BL.readFile (compatDataPath </> dat)
let Right val = bondReadTagged t stream
return val
benchWriteTagged _ = error "wrong type"
benchWriteSchema :: ProtoWrapper -> Benchmark
benchWriteSchema (ProtoWrapper n t dat) =
env getStruct
(bench n . nf (bondWriteWithSchema t schema))
where
schema = getSchema (Proxy :: Proxy Compat)
getStruct = do
stream <- BL.readFile (compatDataPath </> dat)
let Right val = bondReadWithSchema t schema stream
return val
benchWriteSchema p = benchWriteSchema (fromTagged p)