module Main where
import Data.PowerQueue
import Data.PowerQueue.Backend.LevelMem
import Control.Monad
import Criterion.Main
import System.IO.Temp
import qualified Data.Serialize as S
binEncoding :: S.Serialize a => JobEncoding a
binEncoding =
JobEncoding
{ j_encode = S.encode
, j_decode = S.decode
}
nopWorker :: QueueBackend () -> Queue ()
nopWorker be =
newQueue be $ newQueueWorker $ \() -> pure JOk
testCfg :: S.Serialize a => FilePath -> LevelMemCfg a
testCfg fp =
LevelMemCfg
{ lmc_storageDir = fp
, lmc_maxQueueSize = 200000
, lmc_jobEncoding = binEncoding
, lmc_inProgressRecovery = IpRestart
}
main :: IO ()
main =
withSystemTempDirectory "lmsbenchXXX" $ \tempDir ->
withLevelMem (testCfg tempDir) $ \lm ->
do let q = nopWorker (newLevelMemBackend lm)
putStrLn "Filling queue with 100k entries"
replicateM_ 100000 $ enqueueJob () q
putStrLn "Ready."
defaultMain
[ bgroup "enqueue dequeue performance"
[ bench "enqueue + dequeue" $ nfIO $ enqueueJob () q >> workStep q
]
]