hbf-0.1.0.0: bench/Main.hs
module Main where
import Control.Monad.Trans.State (execStateT)
import Criterion.Main
import qualified Data.Text.Lazy.IO as TIO
import System.FilePath (takeBaseName)
import HBF.Compiler as C
import qualified HBF.Eval as E
import HBF.Types
type BenchmarkName = String
type ProgramInput = MockIO
type UnoptimizedP = Program Optimized
type OptimizedP = Program Optimized
programEnv ::
FilePath
-> String
-> IO (BenchmarkName, ProgramInput, OptimizedP, UnoptimizedP)
programEnv file input = do
code <- TIO.readFile file
let (Right (optimized, _)) = C.inMemoryCompile C.defaultCompilerOptions code
let (Right (unoptimized, _)) =
inMemoryCompile noOptimizationCompilerOptions code
return (takeBaseName file, mkMockIOS input, optimized, unoptimized)
mkProgramGroup ::
(BenchmarkName, ProgramInput, OptimizedP, UnoptimizedP) -> Benchmark
mkProgramGroup ~(name, input, optimized, unoptimized) =
bgroup
name
[ bench "fully optimized" $ whnfIO $ execStateT (E.eval optimized) input
, bench "not optimized" $ whnfIO $ execStateT (E.eval unoptimized) input
]
main :: IO ()
main =
defaultMain
[ bgroup
"programs"
[ env (programEnv "tests/factor.bf" "254504\n") mkProgramGroup
, env (programEnv "tests/allfeatures.bf" "0") mkProgramGroup
]
]