packages feed

streamly-0.7.2: benchmark/Streamly/Benchmark/Prelude/NestedConcurrent.hs

-- |
-- Module      : Main
-- Copyright   : (c) 2018 Harendra Kumar
--
-- License     : BSD3
-- Maintainer  : streamly@composewell.com

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

import Streamly.Benchmark.Common (parseCLIOpts)

import Streamly
import Gauge

import qualified Streamly.Benchmark.Prelude.NestedOps as Ops

benchIO :: (NFData b) => String -> (Int -> IO b) -> Benchmark
benchIO name f = bench name $ nfIO $ randomRIO (1,1) >>= f

_benchId :: (NFData b) => String -> (Int -> Identity b) -> Benchmark
_benchId name f = bench name $ nf (\g -> runIdentity (g 1))  f

defaultStreamSize :: Int
defaultStreamSize = 100000

main :: IO ()
main = do
  -- XXX Fix indentation
  (linearCount, cfg, benches) <- parseCLIOpts defaultStreamSize
  let finiteCount = min linearCount defaultStreamSize
  when (finiteCount /= linearCount) $
    putStrLn $ "Limiting stream size to "
               ++ show defaultStreamSize
               ++ " for finite stream operations only"

  finiteCount `seq` linearCount `seq` runMode (mode cfg) cfg benches
    [
      bgroup "aheadly"
      [ benchIO "toNullAp"       $ Ops.toNullAp linearCount       aheadly
      , benchIO "toNull"         $ Ops.toNull linearCount         aheadly
      , benchIO "toNull3"        $ Ops.toNull3 linearCount        aheadly
      -- , benchIO "toList"         $ Ops.toList linearCount         aheadly
      -- XXX consumes too much stack space
      , benchIO "toListSome"     $ Ops.toListSome linearCount     aheadly
      , benchIO "filterAllOut"   $ Ops.filterAllOut linearCount   aheadly
      , benchIO "filterAllIn"    $ Ops.filterAllIn linearCount    aheadly
      , benchIO "filterSome"     $ Ops.filterSome linearCount     aheadly
      , benchIO "breakAfterSome" $ Ops.breakAfterSome linearCount aheadly
      ]

    , bgroup "asyncly"
      [ benchIO "toNullAp"       $ Ops.toNullAp linearCount       asyncly
      , benchIO "toNull"         $ Ops.toNull linearCount         asyncly
      , benchIO "toNull3"        $ Ops.toNull3 linearCount        asyncly
      -- , benchIO "toList"         $ Ops.toList linearCount         asyncly
      , benchIO "toListSome"     $ Ops.toListSome  linearCount    asyncly
      , benchIO "filterAllOut"   $ Ops.filterAllOut linearCount   asyncly
      , benchIO "filterAllIn"    $ Ops.filterAllIn linearCount    asyncly
      , benchIO "filterSome"     $ Ops.filterSome linearCount     asyncly
      , benchIO "breakAfterSome" $ Ops.breakAfterSome linearCount asyncly
      ]

    , bgroup "zipAsyncly"
      [ benchIO "toNullAp"       $ Ops.toNullAp linearCount       zipAsyncly
      ]

    -- Operations that are not scalable to infinite streams
    , bgroup "finite"
      [ bgroup "wAsyncly"
        [ benchIO "toNullAp"       $ Ops.toNullAp finiteCount       wAsyncly
        , benchIO "toNull"         $ Ops.toNull finiteCount         wAsyncly
        , benchIO "toNull3"        $ Ops.toNull3 finiteCount        wAsyncly
        -- , benchIO "toList"         $ Ops.toList finiteCount         wAsyncly
        , benchIO "toListSome"     $ Ops.toListSome finiteCount     wAsyncly
        , benchIO "filterAllOut"   $ Ops.filterAllOut finiteCount   wAsyncly
        -- , benchIO "filterAllIn"    $ Ops.filterAllIn finiteCount    wAsyncly
        , benchIO "filterSome"     $ Ops.filterSome finiteCount     wAsyncly
        , benchIO "breakAfterSome" $ Ops.breakAfterSome finiteCount wAsyncly
        ]
      ]
    ]