packages feed

dep-t-advice-0.4.0.0: benchmark/benchmarks.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneKindSignatures #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ConstraintKinds #-}

module Main where

import Criterion.Main

import Control.Monad.Dep
import Control.Monad.Dep.Advice
import Control.Monad.Dep.Advice.Basic
import Data.Monoid
import Data.Functor.Identity
import Data.Foldable

-- returnMempty' :: forall ca e m r. (Monad m, Monoid r) => Advice ca e m r
-- returnMempty' =
--   makeAdvice @()
--     (\args -> pure (pure args))
--     ( \() action -> do
--         _ <- action
--         pure (mempty :: r)
--     )

mempty' :: forall ca e m r. Monad m => Advice ca e m r
mempty' = makeAdvice @()
  (\args -> pure (pure args))
  (\() -> id)

summy :: Monad m => Int -> Int -> Int -> Int -> DepT NilEnv m (Sum Int)
summy a1 a2 a3 a4 = pure $ Sum a1 <> Sum a2 <> Sum a3 <> Sum a4

summyInstrumented :: Monad m => Int -> Int -> Int -> Int -> DepT NilEnv m (Sum Int)
summyInstrumented = 
    advise @Top mempty summy

summyInstrumented' :: Monad m => Int -> Int -> Int -> Int -> DepT NilEnv m (Sum Int)
summyInstrumented' = 
    advise @Top mempty' summy

main :: IO ()
main =
  defaultMain
    [ bgroup
        "adviceOverhead"
        [ 
            bench "not instrumented" $ 
                whnf 
                (foldl' (+) 0 . take 100000 . map (\(a1, a2, a3, a4) -> runIdentity $ summy a1 a2 a3 a4 `runDepT` NilEnv))
                (repeat (0,0,0,0)),
            bench "instrumented id advice" $ 
                whnf 
                (foldl' (+) 0 . take 100000 . map (\(a1, a2, a3, a4) -> runIdentity $ summyInstrumented a1 a2 a3 a4 `runDepT` NilEnv)) 
                (repeat (0,0,0,0)),
            bench "instrumented locally defined id advice" $ 
                whnf 
                (foldl' (+) 0 . take 100000 . map (\(a1, a2, a3, a4) -> runIdentity $ summyInstrumented' a1 a2 a3 a4 `runDepT` NilEnv)) 
                (repeat (0,0,0,0))
        ]
    ]