katip-0.8.8.4: bench/Main.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Main
( main,
)
where
-------------------------------------------------------------------------------
import Control.Concurrent
import Control.DeepSeq
import Control.Exception.Safe
import Control.Monad
import Criterion.Main
import Data.Aeson
import Data.Monoid as M
-------------------------------------------------------------------------------
import Katip.Core
import Katip.Scribes.Handle
import System.Directory
import System.FilePath
import System.IO
import System.Posix
-------------------------------------------------------------------------------
main :: IO ()
main =
defaultMain
[ handleScribeBench
]
-------------------------------------------------------------------------------
handleScribeBench :: Benchmark
handleScribeBench = bgroup "Katip.Scribes.Handle" $
flip map destinations $ \dest ->
bgroup
(show dest)
[ -- This is variably wildly on disk performance but should be a
-- better test since a push test basically just tests how fast your
-- queue structure is.
bench "full env, flush 1000 writes" $
whnfIO $ do
le <- setupHandleLogEnv dest
runKatipT le $ replicateM_ 1000 $ logItem ExPayload "namespace" Nothing InfoS "example"
closeScribes le
]
where
destinations = [DevNull, TempFile]
--destinations = [DevNull]
-------------------------------------------------------------------------------
data HandleDest = DevNull | TempFile deriving (Show, Eq)
-------------------------------------------------------------------------------
instance NFData LogEnv where
rnf (LogEnv !_ !_ !_ !_ !_ !_) = ()
setupHandleLogEnv :: HandleDest -> IO LogEnv
setupHandleLogEnv hd = do
(scr, _) <- setupHandleEnv hd
registerScribe "handle" scr defaultScribeSettings =<< initLogEnv "katip-bench" "bench"
-------------------------------------------------------------------------------
setupHandleEnv :: HandleDest -> IO (Scribe, ThreadIdText)
setupHandleEnv dest = do
scribe <- setup dest
tid <- myThreadId
return (scribe, mkThreadIdText tid)
-------------------------------------------------------------------------------
data ExPayload = ExPayload
instance ToJSON ExPayload where
toJSON _ = Object M.mempty
instance ToObject ExPayload
instance LogItem ExPayload where
payloadKeys _ _ = AllKeys
-------------------------------------------------------------------------------
setup :: HandleDest -> IO Scribe
setup dest = do
outFile <- case dest of
TempFile -> do
tmp <- getTemporaryDirectory
return (tmp </> "katip-bench.log")
DevNull -> return ("/dev/null")
h <- openFile outFile WriteMode
s <- mkHandleScribe ColorIfTerminal h (permitItem DebugS) V0
let cleanupHandle = hClose h `finally` (when (dest == TempFile) (removeLink outFile))
return s {scribeFinalizer = scribeFinalizer s `finally` cleanupHandle}
-------------------------------------------------------------------------------
deriving instance NFData ThreadIdText
instance NFData Scribe where
rnf (Scribe a b p) =
(a :: Item ExPayload -> IO ())
`seq` b
`seq` (p :: Item ExPayload -> IO Bool)
`seq` ()