{-| Module : Bench Description : Benchmark of Multilinear library Copyright : (c) Artur M. Brodzki, 2018 License : BSD3 Maintainer : artur@brodzki.org Stability : experimental Portability : Windows/POSIX -} module Main ( main ) where import Control.Monad.Trans.Except import Control.Monad.Trans.Maybe import Criterion.Main import Multilinear.Generic import Multilinear.Generic.Serialize import qualified Multilinear.Matrix as Matrix import System.Directory pathPref :: String pathPref = "benchmark/matrix-" gen :: Int -> Int -> Double gen j k = sin (fromIntegral j) + cos (fromIntegral k) writeMatrixBinaryBench :: Int -> Benchmark writeMatrixBinaryBench s = let path = pathPref ++ show s ++ ".zlib" in bench (show s ++ "x" ++ show s) $ nfIO $ toBinaryFile (Matrix.fromIndices "ij" s s gen) path readMatrixBinaryBench :: Int -> Benchmark readMatrixBinaryBench s = do let path = pathPref ++ show s ++ ".zlib" let tensorDoubleIOT = fromBinaryFile path :: ExceptT String IO (Tensor Double) bench (show s ++ "x" ++ show s) $ nfIO $ runExceptT tensorDoubleIOT writeMatrixJSONBench :: Int -> Benchmark writeMatrixJSONBench s = let path = pathPref ++ show s ++ ".json" in bench (show s ++ "x" ++ show s) $ nfIO $ toJSONFile (Matrix.fromIndices "ij" s s gen) path readMatrixJSONBench :: Int -> Benchmark readMatrixJSONBench s = do let path = pathPref ++ show s ++ ".json" let tensorDoubleIOT = fromJSONFile path :: MaybeT IO (Tensor Double) bench (show s ++ "x" ++ show s) $ nfIO $ runMaybeT tensorDoubleIOT writeMatrixCSVBench :: Int -> Benchmark writeMatrixCSVBench s = let path = pathPref ++ show s ++ ".csv" in bench (show s ++ "x" ++ show s) $ nfIO $ toCSVFile (Matrix.fromIndices "ij" s s gen) path readMatrixCSVBench :: Int -> Benchmark readMatrixCSVBench s = do let path = pathPref ++ show s ++ ".csv" let tensorDoubleIOT = fromCSVFile path ',' "ij" :: ExceptT String IO (Tensor Double) bench (show s ++ "x" ++ show s) $ nfIO $ runExceptT tensorDoubleIOT benchSizes :: [Int] benchSizes = [100, 200, 400, 800, 1600] -- ENTRY POINT mainBench :: IO () mainBench = defaultMain [ bgroup "matrix binary write" $ writeMatrixBinaryBench <$> benchSizes, bgroup "matrix binary read" $ readMatrixBinaryBench <$> benchSizes, bgroup "matrix JSON write" $ writeMatrixJSONBench <$> benchSizes, bgroup "matrix JSON read" $ readMatrixJSONBench <$> benchSizes, bgroup "matrix CSV write" $ writeMatrixCSVBench <$> benchSizes, bgroup "matrix CSV read" $ readMatrixCSVBench <$> benchSizes ] main :: IO () main = do mainBench let pathsBinary = (\s -> pathPref ++ show s ++ ".zlib") <$> benchSizes let pathsJSON = (\s -> pathPref ++ show s ++ ".json") <$> benchSizes let pathsCSV = (\s -> pathPref ++ show s ++ ".csv") <$> benchSizes mapM_ removeFile (pathsBinary ++ pathsJSON ++ pathsCSV)