packages feed

compdata-0.7: benchmark-macro/Benchmark.hs

{-# LANGUAGE TypeOperators, DeriveFunctor, DeriveTraversable, DeriveFoldable, TemplateHaskell, GADTs #-}

module Main where

import Criterion.Main
import Data.Comp.Derive
import Data.Comp.DeepSeq ()
import Data.Comp.Arbitrary ()
import Data.Comp.Show ()
import Data.Comp

import qualified Functions.Mono as M
import qualified DataTypes.Mono as M



benchmarks :: String -> Term M.ArithLet -> String -> Term M.ArithExc -> Benchmark
benchmarks n t n' t' = rnf t `seq` rnf t' `seq` getBench
    where getBench = bgroup "" [letBench, excBench]
          letBench = bgroup n
                     [ inlineAnnBench
                     , annInlineBench
                     ]
          excBench = bgroup n' 
                     [ compAnnBench
                     , annCompBench]
          inlineAnnBench = bgroup "inlineAnn" 
                           [ bench "fused" (nf M.inlineAnnFuse t) 
                           , bench "seq" (nf M.inlineAnnSeq t)
                           , bench "implicit, fused" (nf M.inlineAnnImpFuse t) 
                           , bench "implicit, seq" (nf M.inlineAnnImpSeq t) ]
          annInlineBench = bgroup "annInline" 
                           [ bench "fused" (nf M.annInlineFuse t) 
                           , bench "seq" (nf M.annInlineSeq t)
                           , bench "implicit, fused)" (nf M.annInlineImpFuse t) 
                           , bench "implicit, seq" (nf M.annInlineImpSeq t) ]
          compAnnBench = bgroup "compAnn"
                         [ bench "fused" (nf M.compAnnFuse t')
                         , bench "seq" (nf M.compAnnSeq t')]
          annCompBench = bgroup "annComp"
                         [ bench "fused" (nf M.annCompFuse t')
                         , bench "seq" (nf M.annCompSeq t')]

genExpr :: Int -> IO Benchmark
genExpr s = do
  let t = M.exprAL s
  let t' = M.exprAE s
  putStr "size of the term: "
  let termsize = size t
  let termsize' = size t'
  print termsize
  putStr "size of the other term: "
  print termsize'
  return $ benchmarks ("term size="++ show termsize) t ("term size="++ show termsize') t'

main = do b0 <- genExpr 11
          b1 <- genExpr 8
          b2 <- genExpr 4
          defaultMain [b0, b1,b2]