{-# LANGUAGE TypeApplications #-}
module Main where
import GHCupTypes
import Criterion.Main
import Data.Yaml
import System.Directory
import System.IO.Temp
import System.FilePath
import qualified System.IO.Strict as SIO
import qualified Data.ByteString as B
-- Our benchmark harness.
main :: IO ()
main = do
defaultMain [
env setupEnvDecode $ \ ~(yaml, yamlPath) ->
bgroup "decode" [ bench "decodeEither'" $ nf (decodeEither' @Value) yaml
, bench "decodeFileEither" $ nfIO (decodeFileEither @Value yamlPath)
]
, envWithCleanup setupEnvEncode cleanupEnvCode $ \ ~(decoded, tmpdir) ->
bgroup "encode" [ bench "encode" $ nf encode decoded
, bench "encodeFile" $ nfIO (encodeFile (tmpdir </> "encoded") decoded)
]
]
where
setupEnvDecode = do
let yamlPath = "bench/resources/ghcup-0.0.6.yaml"
yaml <- B.readFile yamlPath
pure (yaml, yamlPath)
setupEnvEncode = do
decoded <- read @GHCupInfo <$> SIO.readFile "bench/resources/ghcup-0.0.6.yaml.decoded"
ctmpdir <- getCanonicalTemporaryDirectory
tmpdir <- createTempDirectory ctmpdir "yaml-bench"
pure (decoded, tmpdir)
cleanupEnvCode (_, tmpdir) = do
removePathForcibly tmpdir