mirror of
https://github.com/composewell/streamly.git
synced 2024-09-20 16:08:20 +03:00
5cc6933cdb
1) Add foldr1, findIndices, lookup, find, sequence functions in StreamD, earlier they were present only in StreamK. 2) Change the above functions to use S. in Prelude instead of K. . 3) Add tests for (!!), insertBy, splitAt, the.
208 lines
8.4 KiB
Haskell
208 lines
8.4 KiB
Haskell
-- |
|
|
-- 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 qualified GHC.Exts as GHC
|
|
import qualified LinearOps as Ops
|
|
|
|
import Streamly
|
|
import qualified Streamly.Prelude as S
|
|
import Gauge
|
|
|
|
-- 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.
|
|
|
|
-- | Takes a fold method, and uses it with a default source.
|
|
{-# INLINE benchIOSink #-}
|
|
benchIOSink
|
|
:: (IsStream t, NFData b)
|
|
=> String -> (t IO Int -> IO b) -> Benchmark
|
|
benchIOSink name f = bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.source
|
|
|
|
-- | Takes a source, and uses it with a default drain/fold method.
|
|
{-# INLINE benchIOSrc #-}
|
|
benchIOSrc
|
|
:: (t IO Int -> SerialT IO Int)
|
|
-> String
|
|
-> (Int -> t IO Int)
|
|
-> Benchmark
|
|
benchIOSrc t name f =
|
|
bench name $ nfIO $ randomRIO (1,1) >>= (Ops.toNull t) . f
|
|
|
|
{-# INLINE benchPure #-}
|
|
benchPure :: NFData b => String -> (Int -> a) -> (a -> b) -> Benchmark
|
|
benchPure name src f = bench name $ nfIO $ randomRIO (1,1) >>= return . f . src
|
|
|
|
{-# INLINE benchPureSink #-}
|
|
benchPureSink :: NFData b => String -> (SerialT Identity Int -> b) -> Benchmark
|
|
benchPureSink name f = benchPure name Ops.sourceUnfoldr f
|
|
|
|
{-# INLINE benchPureSinkIO #-}
|
|
benchPureSinkIO
|
|
:: NFData b
|
|
=> String -> (SerialT Identity Int -> IO b) -> Benchmark
|
|
benchPureSinkIO name f =
|
|
bench name $ nfIO $ randomRIO (1, 1) >>= f . Ops.sourceUnfoldr
|
|
|
|
{-# INLINE benchPureSrc #-}
|
|
benchPureSrc :: String -> (Int -> SerialT Identity a) -> Benchmark
|
|
benchPureSrc name src = benchPure name src (runIdentity . runStream)
|
|
|
|
main :: IO ()
|
|
main =
|
|
defaultMain
|
|
[ bgroup "serially"
|
|
[ bgroup "pure"
|
|
[ benchPureSink "id" id
|
|
, benchPureSink "eqBy" Ops.eqBy
|
|
, benchPureSink "==" Ops.eqInstance
|
|
, benchPureSink "/=" Ops.eqInstanceNotEq
|
|
, benchPureSink "cmpBy" Ops.cmpBy
|
|
, benchPureSink "<" Ops.ordInstance
|
|
, benchPureSink "min" Ops.ordInstanceMin
|
|
, benchPureSrc "IsList.fromList" Ops.sourceIsList
|
|
, benchPureSink "IsList.toList" GHC.toList
|
|
, benchPureSrc "IsString.fromString" Ops.sourceIsString
|
|
, benchPure "readsPrec" (\n -> S.fromList [1..n :: Int])
|
|
Ops.readInstance
|
|
, benchPureSink "showsPrec" Ops.showInstance
|
|
, benchPure "showsPrecList" (\n -> S.fromList [1..n :: Int])
|
|
Ops.showInstanceList
|
|
, benchPureSink "foldl'" Ops.pureFoldl'
|
|
, benchPureSink "foldable/foldl'" Ops.foldableFoldl'
|
|
, benchPureSink "foldable/sum" Ops.foldableSum
|
|
, benchPureSinkIO "traversable/mapM" Ops.traversableMapM
|
|
]
|
|
, bgroup "generation"
|
|
[ -- Most basic, barely stream continuations running
|
|
benchIOSrc serially "unfoldr" Ops.sourceUnfoldr
|
|
, benchIOSrc serially "unfoldrM" Ops.sourceUnfoldrM
|
|
, benchIOSrc serially "fromList" Ops.sourceFromList
|
|
, benchIOSrc serially "fromListM" Ops.sourceFromListM
|
|
-- These are essentially cons and consM
|
|
, benchIOSrc serially "fromFoldable" Ops.sourceFromFoldable
|
|
, benchIOSrc serially "fromFoldableM" Ops.sourceFromFoldableM
|
|
-- These are essentially appends
|
|
, benchIOSrc serially "foldMapWith" Ops.sourceFoldMapWith
|
|
, benchIOSrc serially "foldMapWithM" Ops.sourceFoldMapWithM
|
|
]
|
|
, bgroup "elimination"
|
|
[ benchIOSink "toNull" $ Ops.toNull serially
|
|
, benchIOSink "uncons" Ops.uncons
|
|
, benchIOSink "init" Ops.init
|
|
, benchIOSink "tail" Ops.tail
|
|
, benchIOSink "nullHeadTail" Ops.nullHeadTail
|
|
, benchIOSink "mapM_" Ops.mapM_
|
|
, benchIOSink "toList" Ops.toList
|
|
, benchIOSink "foldr" Ops.foldr
|
|
, benchIOSink "foldr1" Ops.foldr1
|
|
, benchIOSink "foldrM" Ops.foldrM
|
|
, benchIOSink "foldl'" Ops.foldl'
|
|
, benchIOSink "foldl1'" Ops.foldl1'
|
|
|
|
, benchIOSink "last" Ops.last
|
|
, benchIOSink "length" Ops.length
|
|
, benchIOSink "elem" Ops.elem
|
|
, benchIOSink "notElem" Ops.notElem
|
|
, benchIOSink "all" Ops.all
|
|
, benchIOSink "any" Ops.any
|
|
, benchIOSink "and" Ops.and
|
|
, benchIOSink "or" Ops.or
|
|
, benchIOSink "find" Ops.find
|
|
, benchIOSink "findIndex" Ops.findIndex
|
|
, benchIOSink "elemIndex" Ops.elemIndex
|
|
, benchIOSink "maximum" Ops.maximum
|
|
, benchIOSink "minimum" Ops.minimum
|
|
, benchIOSink "sum" Ops.sum
|
|
, benchIOSink "product" Ops.product
|
|
]
|
|
, bgroup "transformation"
|
|
[ benchIOSink "scan" (Ops.scan 1)
|
|
, benchIOSink "map" (Ops.map 1)
|
|
, benchIOSink "fmap" (Ops.fmap 1)
|
|
, benchIOSink "mapM" (Ops.mapM serially 1)
|
|
, benchIOSink "mapMaybe" (Ops.mapMaybe 1)
|
|
, benchIOSink "mapMaybeM" (Ops.mapMaybeM 1)
|
|
, bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
|
|
Ops.sequence serially (Ops.sourceUnfoldrMAction n)
|
|
, benchIOSink "findIndices" (Ops.findIndices 1)
|
|
, benchIOSink "elemIndices" (Ops.elemIndices 1)
|
|
-- , benchIOSink "concat" Ops.concat
|
|
]
|
|
, bgroup "transformationX4"
|
|
[ benchIOSink "scan" (Ops.scan 4)
|
|
, benchIOSink "map" (Ops.map 4)
|
|
, benchIOSink "fmap" (Ops.fmap 4)
|
|
, benchIOSink "mapM" (Ops.mapM serially 4)
|
|
, benchIOSink "mapMaybe" (Ops.mapMaybe 4)
|
|
, benchIOSink "mapMaybeM" (Ops.mapMaybeM 4)
|
|
-- , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
|
|
-- Ops.sequence serially (Ops.sourceUnfoldrMAction n)
|
|
, benchIOSink "findIndices" (Ops.findIndices 4)
|
|
, benchIOSink "elemIndices" (Ops.elemIndices 4)
|
|
-- , benchIOSink "concat" Ops.concat
|
|
]
|
|
, bgroup "filtering"
|
|
[ benchIOSink "filter-even" (Ops.filterEven 1)
|
|
, benchIOSink "filter-all-out" (Ops.filterAllOut 1)
|
|
, benchIOSink "filter-all-in" (Ops.filterAllIn 1)
|
|
, benchIOSink "take-all" (Ops.takeAll 1)
|
|
, benchIOSink "takeWhile-true" (Ops.takeWhileTrue 1)
|
|
--, benchIOSink "takeWhileM-true" (Ops.takeWhileMTrue 1)
|
|
, benchIOSink "drop-one" (Ops.dropOne 1)
|
|
, benchIOSink "drop-all" (Ops.dropAll 1)
|
|
, benchIOSink "dropWhile-true" (Ops.dropWhileTrue 1)
|
|
--, benchIOSink "dropWhileM-true" (Ops.dropWhileMTrue 1)
|
|
, benchIOSink "dropWhile-false" (Ops.dropWhileFalse 1)
|
|
]
|
|
, bgroup "filteringX4"
|
|
[ benchIOSink "filter-even" (Ops.filterEven 4)
|
|
, benchIOSink "filter-all-out" (Ops.filterAllOut 4)
|
|
, benchIOSink "filter-all-in" (Ops.filterAllIn 4)
|
|
, benchIOSink "take-all" (Ops.takeAll 4)
|
|
, benchIOSink "takeWhile-true" (Ops.takeWhileTrue 4)
|
|
--, benchIOSink "takeWhileM-true" (Ops.takeWhileMTrue 4)
|
|
, benchIOSink "drop-one" (Ops.dropOne 4)
|
|
, benchIOSink "drop-all" (Ops.dropAll 4)
|
|
, benchIOSink "dropWhile-true" (Ops.dropWhileTrue 4)
|
|
--, benchIOSink "dropWhileM-true" (Ops.dropWhileMTrue 4)
|
|
, benchIOSink "dropWhile-false" (Ops.dropWhileFalse 4)
|
|
]
|
|
, bgroup "zipping"
|
|
[ benchIOSink "eqBy" Ops.eqBy
|
|
, benchIOSink "cmpBy" Ops.cmpBy
|
|
, benchIOSink "zip" Ops.zip
|
|
, benchIOSink "zipM" Ops.zipM
|
|
]
|
|
, benchIOSink "merge" Ops.merge
|
|
, bgroup "mixedX4"
|
|
[ benchIOSink "scan-map" (Ops.scanMap 4)
|
|
, benchIOSink "drop-map" (Ops.dropMap 4)
|
|
, benchIOSink "drop-scan" (Ops.dropScan 4)
|
|
, benchIOSink "take-drop" (Ops.takeDrop 4)
|
|
, benchIOSink "take-scan" (Ops.takeScan 4)
|
|
, benchIOSink "take-map" (Ops.takeMap 4)
|
|
, benchIOSink "filter-drop" (Ops.filterDrop 4)
|
|
, benchIOSink "filter-take" (Ops.filterTake 4)
|
|
, benchIOSink "filter-scan" (Ops.filterScan 4)
|
|
, benchIOSink "filter-map" (Ops.filterMap 4)
|
|
]
|
|
, bgroup "iterated"
|
|
[ benchIOSrc serially "mapM" Ops.iterateMapM
|
|
, benchIOSrc serially "scan(1/100)" Ops.iterateScan
|
|
, benchIOSrc serially "filterEven" Ops.iterateFilterEven
|
|
, benchIOSrc serially "takeAll" Ops.iterateTakeAll
|
|
, benchIOSrc serially "dropOne" Ops.iterateDropOne
|
|
, benchIOSrc serially "dropWhileFalse" Ops.iterateDropWhileFalse
|
|
, benchIOSrc serially "dropWhileTrue" Ops.iterateDropWhileTrue
|
|
]
|
|
]
|
|
]
|