effectful-2.0.0.0: bench/Main.hs
{-# LANGUAGE CPP #-}
module Main (main) where
#ifdef VERSION_criterion
import Criterion
import Criterion.Main
#endif
#ifdef VERSION_tasty_bench
import Test.Tasty.Bench
#endif
import Concurrency
import Countdown
import FileSizes
import Unlift
main :: IO ()
main = defaultMain
[ concurrencyBenchmark
, unliftBenchmark
, bgroup "countdown" $ map countdown [1000, 2000, 3000]
, bgroup "filesize" $ map filesize [1000, 2000, 3000]
]
countdown :: Integer -> Benchmark
countdown n = bgroup (show n)
[ bench "reference (pure)" $ nf countdownRef n
, bench "reference (ST)" $ nf countdownST n
, bgroup "effectful (local/static)"
[ bench "shallow" $ nf countdownEffectfulLocal n
, bench "deep" $ nf countdownEffectfulLocalDeep n
]
, bgroup "effectful (local/static/state)"
[ bench "shallow" $ nf countdownEffectfulLocalSt n
, bench "deep" $ nf countdownEffectfulLocalDeepSt n
]
, bgroup "effectful (local/static/stateM)"
[ bench "shallow" $ nf countdownEffectfulLocalStM n
, bench "deep" $ nf countdownEffectfulLocalDeepStM n
]
, bgroup "effectful (local/dynamic)"
[ bench "shallow" $ nf countdownEffectfulDynLocal n
, bench "deep" $ nf countdownEffectfulDynLocalDeep n
]
, bgroup "effectful (local/dynamic/double)"
[ bench "shallow" $ nf countdownEffectfulDoubleDynLocal n
, bench "deep" $ nf countdownEffectfulDoubleDynLocalDeep n
]
, bgroup "effectful (shared/static)"
[ bench "shallow" $ nf countdownEffectfulShared n
, bench "deep" $ nf countdownEffectfulSharedDeep n
]
, bgroup "effectful (shared/dynamic)"
[ bench "shallow" $ nf countdownEffectfulDynShared n
, bench "deep" $ nf countdownEffectfulDynSharedDeep n
]
, bgroup "effectful (shared/dynamic/double)"
[ bench "shallow" $ nf countdownEffectfulDoubleDynShared n
, bench "deep" $ nf countdownEffectfulDoubleDynSharedDeep n
]
#ifdef VERSION_cleff
, bgroup "cleff (local)"
[ bench "shallow" $ nf countdownCleffLocal n
, bench "deep" $ nf countdownCleffLocalDeep n
]
, bgroup "cleff (IORef)"
[ bench "shallow" $ nf countdownCleffIORef n
, bench "deep" $ nf countdownCleffIORefDeep n
]
#endif
#ifdef VERSION_freer_simple
, bgroup "freer-simple"
[ bench "shallow" $ nf countdownFreerSimple n
, bench "deep" $ nf countdownFreerSimpleDeep n
]
#endif
#ifdef VERSION_eff
, bgroup "eff"
[ bench "shallow" $ nf countdownEff n
, bench "deep" $ nf countdownEffDeep n
]
#endif
#ifdef VERSION_mtl
, bgroup "mtl"
[ bench "shallow" $ nf countdownMtl n
, bench "deep" $ nf countdownMtlDeep n
]
#endif
#ifdef VERSION_fused_effects
, bgroup "fused-effects"
[ bench "shallow" $ nf countdownFusedEffects n
, bench "deep" $ nf countdownFusedEffectsDeep n
]
#endif
#ifdef VERSION_polysemy
, bgroup "polysemy"
[ bench "shallow" $ nf countdownPolysemy n
, bench "deep" $ nf countdownPolysemyDeep n
]
#endif
]
filesize :: Int -> Benchmark
filesize n = bgroup (show n)
[ bench "reference" $ nfAppIO ref_calculateFileSizes (take n files)
, bgroup "effectful"
[ bench "shallow" $ nfAppIO effectful_calculateFileSizes (take n files)
, bench "deep" $ nfAppIO effectful_calculateFileSizesDeep (take n files)
]
#ifdef VERSION_cleff
, bgroup "cleff"
[ bench "shallow" $ nfAppIO cleff_calculateFileSizes (take n files)
, bench "deep" $ nfAppIO cleff_calculateFileSizesDeep (take n files)
]
#endif
#ifdef VERSION_freer_simple
, bgroup "freer-simple"
[ bench "shallow" $ nfAppIO fs_calculateFileSizes (take n files)
, bench "deep" $ nfAppIO fs_calculateFileSizesDeep (take n files)
]
#endif
#ifdef VERSION_eff
, bgroup "eff"
[ bench "shallow" $ nfAppIO eff_calculateFileSizes (take n files)
, bench "deep" $ nfAppIO eff_calculateFileSizesDeep (take n files)
]
#endif
#ifdef VERSION_mtl
, bgroup "mtl"
[ bench "shallow" $ nfAppIO mtl_calculateFileSizes (take n files)
, bench "deep" $ nfAppIO mtl_calculateFileSizesDeep (take n files)
]
#endif
#ifdef VERSION_fused_effects
, bgroup "fused-effects"
[ bench "shallow" $ nfAppIO fe_calculateFileSizes (take n files)
, bench "deep" $ nfAppIO fe_calculateFileSizesDeep (take n files)
]
#endif
#ifdef VERSION_polysemy
, bgroup "polysemy"
[ bench "shallow" $ nfAppIO poly_calculateFileSizes (take n files)
, bench "deep" $ nfAppIO poly_calculateFileSizesDeep (take n files)
]
#endif
]
where
files :: [FilePath]
files = repeat "effectful.cabal"