datafix-0.0.0.1: bench/Main.hs
{-# LANGUAGE FlexibleInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
import Algebra.Lattice
import Control.DeepSeq
import Criterion
import Criterion.Main
import Datafix
import Datafix.Worklist (Density (..),
IterationBound (..),
solveProblem)
import Datafix.Worklist.Graph (GraphRef)
import Numeric.Natural
import qualified Analyses.AdHocStrAnal as AdHocStrAnal
import qualified Analyses.StrAnal as StrAnal
import Analyses.StrAnal.Strictness
import Analyses.Syntax.MkCoreFromFile (compileCoreExpr)
import Analyses.Syntax.MkCoreHelpers
import Sum
import CoreSeq (seqExpr)
import CoreSyn
import CoreTidy (tidyExpr)
import Id
import VarEnv (emptyTidyEnv)
instance JoinSemiLattice Natural where
(\/) = max
instance BoundedJoinSemiLattice Natural where
bottom = 0
-- | For 'Criterion.env'.
instance NFData CoreExpr where
rnf = seqExpr
fixSum :: GraphRef graph => (Node -> Density graph) -> Int -> Natural
fixSum density n = solveProblem sumProblem (density (Node n)) NeverAbort (Node n)
main :: IO ()
main = defaultMain
[ bgroup "sum" $ map sumGroup [100, 1000, 10000]
, bgroup "stranal"
[ strAnalGroup "simpleRecursive1" simpleRecursive1
, strAnalGroup "nestedRecursive1" nestedRecursive1
, strAnalFileGroup "exprs/const.hs"
, strAnalFileGroup "exprs/findLT.hs"
, strAnalFileGroup "exprs/kahan.hs"
, strAnalFileGroup "exprs/sieve.hs"
, strAnalFileGroup "exprs/lambda.hs"
]
] where
sumGroup n =
bgroup (show n)
[ bench "baseline" (whnf (\n' -> sum [1..n']) n)
, bench "sparse" (whnf (fixSum (const Sparse)) n)
, bench "dense" (whnf (fixSum Dense) n)
]
strAnalGroup descr e =
bgroup descr
[ bench "baseline" (whnf (seqStrLattice . AdHocStrAnal.analyse) e)
, bench "datafix" (whnf (seqStrLattice . StrAnal.analyse) e)
]
strAnalFileGroup file =
env (compileCoreExpr file) $ \e ->
bgroup file
[ bench "baseline" (whnf (seqStrLattice . AdHocStrAnal.analyse) e)
, bench "datafix" (whnf (seqStrLattice . StrAnal.analyse) e)
]
seqStrLattice :: StrLattice -> ()
seqStrLattice l = strType l `seq` annotations l `seq` ()
x, x1, x2, z, b, b1, b2, f, g :: Id
[x, x1, x2, z, b, b1, b2, f, g] = mkTestIds
[ ("x", int)
, ("x1", int)
, ("x2", int)
, ("z", int)
, ("b", bool)
, ("b1", bool)
, ("b2", bool)
, ("f", bool2int2int)
, ("g", bool2int2int)
]
-- | @
-- let f b x =
-- if b
-- then f b z
-- else z
-- in f False 1
-- @
simpleRecursive1 :: CoreExpr
simpleRecursive1 = tidyExpr emptyTidyEnv $
letrec
f (lam b $ lam x $
ite (var b)
(var f $$ var b $$ var z)
(var z))
(var f $$ boolLit False $$ intLit 1)
-- | @
-- let f b1 x1 =
-- let g b2 x2 =
-- if b2
-- then g b2 z
-- else f b2 x2
-- in if b1
-- then g b1 x1
-- else z
-- in f False 1
-- @
nestedRecursive1 :: CoreExpr
nestedRecursive1 = tidyExpr emptyTidyEnv $
letrec
f (lam b1 $ lam x1 $
letrec
g (lam b2 $ lam x2 $
ite (var b2)
(var g $$ var b2 $$ var z)
(var f $$ var b2 $$ var x2))
(ite (var b)
(var g $$ var b1 $$ var x1)
(var z)))
(var f $$ boolLit False $$ intLit 1)