packages feed

streamly-0.7.2: benchmark/Streamly/Benchmark/Data/Unfold.hs

-- |
-- Module      : Streamly.Benchmark.Data.Fold
-- Copyright   : (c) 2018 Composewell
--
-- License     : MIT
-- Maintainer  : streamly@composewell.com

{-# LANGUAGE FlexibleContexts #-}

module Main (main) where

import Control.DeepSeq (NFData(..))

import System.Random (randomRIO)

import Gauge

import Prelude hiding (concat)

import Streamly.Benchmark.Common
import Streamly.Benchmark.Data.NestedUnfoldOps

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

-------------------------------------------------------------------------------
-- Stream folds
-------------------------------------------------------------------------------

o_1_space_serial_outerProductUnfolds :: Int -> [Benchmark]
o_1_space_serial_outerProductUnfolds value =
    [ bgroup
          "serially"
          [ bgroup
                "outer-product-unfolds"
                [ benchIO "toNull" $ toNull value
                , benchIO "toNull3" $ toNull3 value
                , benchIO "concat" $ concat value
                , benchIO "filterAllOut" $ filterAllOut value
                , benchIO "filterAllIn" $ filterAllIn value
                , benchIO "filterSome" $ filterSome value
                , benchIO "breakAfterSome" $ breakAfterSome value
                ]
          ]
    ]


o_n_space_serial_outerProductUnfolds :: Int -> [Benchmark]
o_n_space_serial_outerProductUnfolds value =
    [ bgroup
          "serially"
          [ bgroup
                "outer-product-unfolds"
                [ benchIO "toList" $ toList value
                , benchIO "toListSome" $ toListSome value
                ]
          ]
    ]

-------------------------------------------------------------------------------
-- Driver
-------------------------------------------------------------------------------

main :: IO ()
main = do
  (value, cfg, benches) <- parseCLIOpts defaultStreamSize
  value `seq` runMode (mode cfg) cfg benches (allBenchmarks value)
  where
    allBenchmarks value =
      [ bgroup
          "o-1-space"
          [bgroup "unfold" (o_1_space_serial_outerProductUnfolds value)]
      , bgroup
          "o-n-space"
          [bgroup "unfold" (o_n_space_serial_outerProductUnfolds value)]
      ]