-- | We benchmark different stages of parsing. @small@, @medium@, and -- @large@ are three sets of CMs with different file sizes. -- -- TODO -- -- - only extract header information -- - single-threaded full parsing -- - multi-threaded full parsing module Main where import Control.Lens import Control.Monad.Trans.Writer.Strict import Control.Monad (when) import Criterion.Main import Data.List as L import qualified Data.Text as T import qualified Data.Text.IO as T import Data.Maybe (maybeToList) import Biobase.SElab.CM.Types as CM import Biobase.SElab.HMM.Types as HMM import Biobase.SElab.Model.Import import Biobase.SElab.Model.Types {- -- | Parse only the header parseOnlyHeader :: Int -> String -> IO [PreModel] parseOnlyHeader n file = do (xs,log) <- runResourceT $ runWriterT $ sourceFile file $= ungzip $= preModels $= ccm n $$ consume when (not $ T.null log) $ T.putStr log -- print $ length xs -- print $ xs ^.. ix 0 . _Right . _1 . CM.name -- print $ xs ^.. ix 1 . _Left . _1 . HMM.name return xs parseFull :: Int -> String -> IO [CM] parseFull n file = do (xs,log) <- runResourceT $ runWriterT $ sourceFile file $= ungzip $= preModels $= ccm n $= finalizeModels 1 $= attachHMMs $$ consume when (not $ T.null log) $ T.putStr log return xs parseFullPar :: Int -> String -> IO [CM] parseFullPar n file = do (xs,log) <- runResourceT $ runWriterT $ sourceFile file $= ungzip $= preModels $= ccm n $= finalizeModels 64 $= attachHMMs $$ consume when (not $ T.null log) $ T.putStr log return xs main :: IO () main = defaultMain -- only parse the header [ bgroup "header" [ bench "x 1" $ nfIO $ parseOnlyHeader 1 "./rfam-models/CL00001.cm.gz" ] -- full parsing, single-threaded , bgroup "singlethreaded" [ bench "small" $ nfIO $ parseFull 1 "./rfam-models/CL00001.cm.gz" , bench "medium" $ nfIO $ parseFull 10 "./rfam-models/CL00001.cm.gz" , bench "large" $ nfIO $ parseFull 100 "./rfam-models/CL00001.cm.gz" ] -- full parsing, multi-threaded , bgroup "multithreaded" [ bench "small" $ nfIO $ parseFullPar 1 "./rfam-models/CL00001.cm.gz" , bench "medium" $ nfIO $ parseFullPar 10 "./rfam-models/CL00001.cm.gz" , bench "large" $ nfIO $ parseFullPar 100 "./rfam-models/CL00001.cm.gz" ] ] ccm n = go where go = do xx <- await yy <- await case xx of Nothing -> return () Just x -> do Prelude.mapM_ yield $ L.concat $ L.replicate n $ x : maybeToList yy go -} main :: IO () main = return ()