mirror of
https://github.com/composewell/streamly.git
synced 2024-09-20 16:08:20 +03:00
c39a442ddf
Also fix the signature of foldl1' Add notes about state passing
135 lines
5.4 KiB
Haskell
135 lines
5.4 KiB
Haskell
-- |
|
|
-- Module : Main
|
|
-- Copyright : (c) 2018 Harendra Kumar
|
|
--
|
|
-- License : BSD3
|
|
-- Maintainer : harendra.kumar@gmail.com
|
|
|
|
{-# LANGUAGE CPP #-}
|
|
|
|
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 "fromList" D.toNull D.sourceFromList
|
|
-- , 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 "scanlM'" 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
|
|
, benchIO "takeWhile-true" D.takeWhileTrue D.sourceUnfoldrM
|
|
, benchIO "drop-all" D.dropAll D.sourceUnfoldrM
|
|
, benchIO "dropWhile-true" D.dropWhileTrue D.sourceUnfoldrM
|
|
]
|
|
, benchIO "zip" D.zip D.sourceUnfoldrM
|
|
, bgroup "compose"
|
|
[ benchIO "mapM" D.composeMapM D.sourceUnfoldrM
|
|
#if __GLASGOW_HASKELL__ != 802
|
|
, benchIO "map-with-all-in-filter" D.composeMapAllInFilter D.sourceUnfoldrM
|
|
, benchIO "all-in-filters" D.composeAllInFilters D.sourceUnfoldrM
|
|
, benchIO "all-out-filters" D.composeAllOutFilters D.sourceUnfoldrM
|
|
#endif
|
|
]
|
|
-- Scaling with same operation in sequence
|
|
, bgroup "compose-scaling"
|
|
[ benchIO "1" (D.composeScaling 1) D.sourceUnfoldrM
|
|
, benchIO "2" (D.composeScaling 2) D.sourceUnfoldrM
|
|
, benchIO "3" (D.composeScaling 3) D.sourceUnfoldrM
|
|
, benchIO "4" (D.composeScaling 4) 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
|
|
, benchFold "init" K.init K.sourceUnfoldrM
|
|
, benchFold "tail" K.tail 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
|
|
]
|
|
]
|
|
]
|