packages feed

streamly-0.4.0: benchmark/BaseStreams.hs

-- |
-- Module      : Main
-- Copyright   : (c) 2018 Harendra Kumar
--
-- License     : BSD3
-- Maintainer  : harendra.kumar@gmail.com

import Control.DeepSeq (NFData)
-- import Data.Functor.Identity (Identity, runIdentity)
import System.Random (randomRIO)

import Gauge
import qualified StreamDOps as D
import qualified StreamKOps as K

-- We need a monadic bind here to make sure that the function f does not get
-- completely optimized out by the compiler in some cases.
{-# INLINE benchIO #-}
benchIO :: String -> (a IO Int -> IO ()) -> (Int -> a IO Int) -> Benchmark
benchIO name run f = bench name $ nfIO $ randomRIO (1,1000) >>= run . f

benchFold :: NFData b
    => String -> (t IO Int -> IO b) -> (Int -> t IO Int) -> Benchmark
benchFold name f src = bench name $ nfIO $ randomRIO (1,1000) >>= f . src

{-
_benchId :: NFData b => String -> (Ops.Stream m Int -> Identity b) -> Benchmark
_benchId name f = bench name $ nf (runIdentity . f) (Ops.source 10)
-}

main :: IO ()
main = do
  defaultMain
    [ bgroup "streamD"
      [ bgroup "generation"
        [ benchIO "unfoldr"      D.toNull D.sourceUnfoldr
        , benchIO "unfoldrM"     D.toNull D.sourceUnfoldrM
        , benchIO "fromEnum"     D.toNull D.sourceFromEnum

        , benchIO "fromFoldable" D.toNull D.sourceFromFoldable
        -- , benchIO "fromFoldableM" D.sourceFromFoldableM
        ]
      , bgroup "elimination"
        [ benchIO "toNull" D.toNull D.sourceUnfoldrM
        , benchIO "uncons" D.uncons D.sourceUnfoldrM
        , benchIO "nullHeadTail" D.nullHeadTail D.sourceUnfoldrM
        ]
      , bgroup "transformation"
        [ -- benchIO "scan" D.scan D.sourceUnfoldrM
          benchIO "map"  D.map D.sourceUnfoldrM
        , benchIO "mapM" D.mapM D.sourceUnfoldrM
        ]
      , bgroup "filtering"
        [ benchIO "filter-even"    D.filterEven D.sourceUnfoldrM
        , benchIO "filter-all-out" D.filterAllOut D.sourceUnfoldrM
        , benchIO "filter-all-in"  D.filterAllIn D.sourceUnfoldrM
        , benchIO "take-all"       D.takeAll D.sourceUnfoldrM
        ]
      ]
    , bgroup "streamK"
      [ bgroup "generation"
        [ benchIO "unfoldr"       K.toNull K.sourceUnfoldr
        , benchIO "unfoldrM"      K.toNull K.sourceUnfoldrM
        -- , benchIO "fromEnum"     K.toNull K.sourceFromEnum

        , benchIO "fromFoldable"  K.toNull K.sourceFromFoldable
        , benchIO "fromFoldableM" K.toNull K.sourceFromFoldableM

        -- appends
        , benchIO "foldMapWith"  K.toNull K.sourceFoldMapWith
        , benchIO "foldMapWithM" K.toNull K.sourceFoldMapWithM
        ]
      , bgroup "elimination"
        [ benchIO "toNull" K.toNull K.sourceUnfoldrM
        , benchIO "uncons" K.uncons K.sourceUnfoldrM
        , benchIO "nullHeadTail" K.nullHeadTail K.sourceUnfoldrM
        , benchFold "toList" K.toList K.sourceUnfoldrM
        , benchFold "fold"   K.foldl  K.sourceUnfoldrM
        , benchFold "last"   K.last   K.sourceUnfoldrM
        ]
      , bgroup "transformation"
        [ benchIO "scan"   K.scan K.sourceUnfoldrM
        , benchIO "map"    K.map K.sourceUnfoldrM
        , benchIO "mapM"   K.mapM K.sourceUnfoldrM
        , benchIO "concat" K.concat K.sourceUnfoldrM
        ]
      , bgroup "filtering"
        [ benchIO "filter-even"    K.filterEven K.sourceUnfoldrM
        , benchIO "filter-all-out" K.filterAllOut K.sourceUnfoldrM
        , benchIO "filter-all-in"  K.filterAllIn K.sourceUnfoldrM
        , benchIO "take-all"       K.takeAll K.sourceUnfoldrM
        , benchIO "takeWhile-true" K.takeWhileTrue K.sourceUnfoldrM
        , benchIO "drop-all"       K.dropAll K.sourceUnfoldrM
        , benchIO "dropWhile-true" K.dropWhileTrue K.sourceUnfoldrM
        ]
      , benchIO "zip" K.zip K.sourceUnfoldrM
      , bgroup "compose"
        [ benchIO "mapM" K.composeMapM K.sourceUnfoldrM
        , benchIO "map-with-all-in-filter" K.composeMapAllInFilter K.sourceUnfoldrM
        , benchIO "all-in-filters" K.composeAllInFilters K.sourceUnfoldrM
        , benchIO "all-out-filters" K.composeAllOutFilters K.sourceUnfoldrM
        ]
        -- Scaling with same operation in sequence
      , bgroup "compose-scaling"
        [ benchIO "1" (K.composeScaling 1) K.sourceUnfoldrM
        , benchIO "2" (K.composeScaling 2) K.sourceUnfoldrM
        , benchIO "3" (K.composeScaling 3) K.sourceUnfoldrM
        , benchIO "4" (K.composeScaling 4) K.sourceUnfoldrM
        ]
      ]
    ]