capnp-0.17.0.0: bench/Main.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TypeApplications #-}
module Main (main) where
import qualified Capnp as C
import Capnp.Mutability (thaw)
import qualified Capnp.Untyped as U
import Control.DeepSeq (NFData (..))
import Control.Monad (unless)
import Criterion.Main
import qualified Data.ByteString as BS
import System.Exit (ExitCode (..))
import qualified System.Process.ByteString as PB
-- Get the raw bytes of a CodeGeneratorRequest for all of the bundled
-- capnproto core schema. Useful as a source of generic test data.
getCGRBytes :: IO BS.ByteString
getCGRBytes = do
(exit, cgrBytes, _) <-
PB.readProcessWithExitCode
"capnp"
[ "compile",
"-o-",
"-I",
"core-schema/",
"--src-prefix=core-schema/",
"core-schema/capnp/schema.capnp",
"core-schema/capnp/stream.capnp",
"core-schema/capnp/rpc-twoparty.capnp",
"core-schema/capnp/persistent.capnp",
"core-schema/capnp/rpc.capnp",
"core-schema/capnp/compat/json.capnp",
"core-schema/capnp/c++.capnp"
]
""
unless (exit == ExitSuccess) $ error "capnp compile failed"
pure cgrBytes
instance NFData (C.Message mut) where
rnf = (`seq` ())
main :: IO ()
main = do
cgrBytes <- getCGRBytes
msg <- C.bsToMsg cgrBytes
let whnfLTIO = whnfIO . C.evalLimitT maxBound
defaultMain
[ bench "canonicalize/IO" $ whnfLTIO $ do
root <- U.rootPtr msg
C.canonicalize root,
bench "canonicalize/PureBuilder" $ whnfLTIO $ do
C.createPure maxBound $ do
root <- U.rootPtr msg
(msg, _seg) <- C.canonicalize root
pure msg,
env
( C.evalLimitT maxBound $ do
mutMsg <- thaw msg
newMsg <- C.newMessage Nothing
pure (mutMsg, newMsg)
)
( \ ~(mutMsg, newMsg) -> bench "copy" $ whnfLTIO $ do
root <- U.rootPtr mutMsg
U.copyPtr newMsg (Just (U.PtrStruct root))
)
]