on master help sign in
Merge Parallel.hs into Prelude.hs

* Parallel.hs -> lib/Streamly/Benchmark/Prelude.hs * Modify Parallel.hs accordingly

commit7f5c73f6455b595e2a99700a85eef0e5296e6260 authoradithyaov <adithya@composewell.com> dateThu 27 Feb 2020, 03:44 (7 years ago) parentfa8a2cf
2 files changed+120−79
benchmark/Parallel.hs+17−79 benchmark/lib/Streamly/Benchmark/Prelude.hs+103
benchmark/Parallel.hs+17−79
@@ -1,4 +1,3 @@
1−{-# LANGUAGE CPP #-}
21-- |
32-- Module : Main
43-- Copyright : (c) 2018 Harendra Kumar
@@ -6,88 +5,27 @@
65-- License : BSD3
76-- Maintainer : streamly@composewell.com
87
9−import Control.DeepSeq (NFData)
10−-- import Data.Functor.Identity (Identity, runIdentity)
11−import System.Random (randomRIO)
8+import Streamly.Benchmark.Common
9+import Streamly.Benchmark.Prelude
1210
13−import Streamly.Benchmark.Common (parseCLIOpts)
14−
15−import Streamly
1611import Gauge
1712
18−import qualified Streamly.Benchmark.Prelude as Ops
19−import qualified NestedOps as Nested
20−
21−{-# INLINE benchIONested #-}
22−benchIONested :: (NFData b) => String -> (Int -> IO b) -> Benchmark
23−benchIONested name f = bench name $ nfIO $ randomRIO (1,1) >>= f
24−
25−-- We need a monadic bind here to make sure that the function f does not get
26−-- completely optimized out by the compiler in some cases.
27−--
28−-- | Takes a fold method, and uses it with a default source.
29−{-# INLINE benchIO #-}
30−benchIO :: (IsStream t, NFData b) => Int -> String -> (t IO Int -> IO b) -> Benchmark
31−benchIO value name f = bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.source value
32−
33−-- | Takes a source, and uses it with a default drain/fold method.
34−{-# INLINE benchSrcIO #-}
35−benchSrcIO
36− :: (t IO Int -> SerialT IO Int)
37− -> String
38− -> (Int -> t IO Int)
39− -> Benchmark
40−benchSrcIO t name f
41− = bench name $ nfIO $ randomRIO (1,1) >>= Ops.toNull t . f
42−
43−defaultStreamSize :: Int
44−defaultStreamSize = 100000
45−
46−linear :: Int -> Int -> [Benchmark]
47−linear value value2 =
48− [ -- unfoldr is pure and works serially irrespective of the stream type
49− benchSrcIO parallely "unfoldr" (Ops.sourceUnfoldr value)
50− , benchSrcIO parallely "unfoldrM" (Ops.sourceUnfoldrM value)
51− , benchSrcIO parallely "fromFoldable" (Ops.sourceFromFoldable value)
52− , benchSrcIO parallely "fromFoldableM" (Ops.sourceFromFoldableM value)
53− , benchSrcIO parallely "foldMapWith" (Ops.sourceFoldMapWith value)
54− , benchSrcIO parallely "foldMapWithM" (Ops.sourceFoldMapWithM value)
55− , benchSrcIO parallely "foldMapM" (Ops.sourceFoldMapM value)
56− -- map/fmap are pure and therefore no concurrency would be added on top
57− -- of what the source stream (i.e. unfoldrM) provides.
58− , benchIO value "map" $ Ops.map' parallely 1
59− , benchIO value "fmap" $ Ops.fmap' parallely 1
60− , benchIO value "mapM" $ Ops.mapM parallely 1
61− , benchIONested "concatMapWith (2,x/2)"
62− (Ops.concatStreamsWith parallel 2 (value `div` 2))
63− , benchIONested "concatMapWith (sqrt x,sqrt x)"
64− (Ops.concatStreamsWith parallel value2 value2)
65− , benchIONested "concatMapWith (sqrt x * 2,sqrt x / 2)"
66− (Ops.concatStreamsWith parallel (value2 * 2) (value2 `div` 2))
67− ]
68−
69−nested :: Int -> [Benchmark]
70−nested value =
71− [ benchIONested "toNullAp" $ Nested.toNullAp value parallely
72− , benchIONested "toNull" $ Nested.toNull value parallely
73− , benchIONested "toNull3" $ Nested.toNull3 value parallely
74− -- , benchIO "toList" $ Ops.toList value parallely
75− -- XXX fix thread blocked indefinitely in MVar
76− -- , benchIO "toListSome" $ Ops.toListSome value parallely
77− , benchIONested "filterAllOut" $ Nested.filterAllOut value parallely
78− , benchIONested "filterAllIn" $ Nested.filterAllIn value parallely
79− , benchIONested "filterSome" $ Nested.filterSome value parallely
80− , benchIONested "breakAfterSome" $ Nested.breakAfterSome value parallely
81− ]
82−
8313main :: IO ()
8414main = do
8515 (value, cfg, benches) <- parseCLIOpts defaultStreamSize
86− let value2 = round $ sqrt $ (fromIntegral value :: Double)
87− value2 `seq` value `seq`
88− runMode (mode cfg) cfg benches $
89− [ bgroup "parallelly"
90− [ bgroup "linear" $ linear value value2
91− , bgroup "nested" $ nested value
92− ]
16+ -- let value2 = round $ sqrt $ (fromIntegral value :: Double)
17+ value `seq`
18+ runMode
19+ (mode cfg)
20+ cfg
21+ benches
22+ (concat [linear value, o_1_space_parallel_outerProductStreams value])
23+ where
24+ linear value =
25+ concat
26+ [ o_1_space_parallel_generation value
27+ , o_1_space_parallel_concatFoldable value
28+ -- , o_n_space_parallel_outerProductStreams
29+ , o_1_space_parallel_concatMap value
30+ , o_1_space_parallel_transformation value
9331 ]
benchmark/lib/Streamly/Benchmark/Prelude.hs+103
@@ -54,12 +54,14 @@ import Streamly
5454 , aheadly
5555 , asyncly
5656 , serially
57+ , parallely
5758 , wAsyncly
5859 , wSerially
5960 , zipSerially
6061 , ahead
6162 , async
6263 , wAsync
64+ , parallel
6365 , maxBuffer
6466 , maxThreads
6567 )
@@ -2484,3 +2486,104 @@ o_1_space_async_zip value =
24842486 ]
24852487 ]
24862488 ]
2489+
2490+o_1_space_parallel_generation :: Int -> [Benchmark]
2491+o_1_space_parallel_generation value =
2492+ [ bgroup
2493+ "parallely"
2494+ [ bgroup
2495+ "generation"
2496+ [ benchSrcIO parallely "unfoldr" (sourceUnfoldr value)
2497+ , benchSrcIO parallely "unfoldrM" (sourceUnfoldrM value)
2498+-- , benchSrcIO parallely "fromFoldable" (sourceFromFoldable value)
2499+ , benchSrcIO
2500+ parallely
2501+ "fromFoldableM"
2502+ (sourceFromFoldableM value)
2503+ , benchSrcIO
2504+ parallely
2505+ "unfoldrM maxThreads 1"
2506+ (maxThreads 1 . sourceUnfoldrM value)
2507+ , benchSrcIO
2508+ parallely
2509+ "unfoldrM maxBuffer 1 (x/10 ops)"
2510+ (maxBuffer 1 . sourceUnfoldrMN (value `div` 10))
2511+ ]
2512+ ]
2513+ ]
2514+
2515+o_1_space_parallel_concatFoldable :: Int -> [Benchmark]
2516+o_1_space_parallel_concatFoldable value =
2517+ [ bgroup
2518+ "parallely"
2519+ [ bgroup
2520+ "concat-foldable"
2521+ [ benchSrcIO parallely "foldMapWith" (sourceFoldMapWith value)
2522+ , benchSrcIO parallely "foldMapWithM" (sourceFoldMapWithM value)
2523+ , benchSrcIO parallely "foldMapM" (sourceFoldMapM value)
2524+ ]
2525+ ]
2526+ ]
2527+
2528+o_1_space_parallel_concatMap :: Int -> [Benchmark]
2529+o_1_space_parallel_concatMap value =
2530+ value2 `seq`
2531+ [ bgroup
2532+ "parallely"
2533+ [ benchMonadicSrcIO
2534+ "concatMapWith (2,x/2)"
2535+ (concatStreamsWith parallel 2 (value `div` 2))
2536+ , benchMonadicSrcIO
2537+ "concatMapWith (sqrt x,sqrt x)"
2538+ (concatStreamsWith parallel value2 value2)
2539+ , benchMonadicSrcIO
2540+ "concatMapWith (sqrt x * 2,sqrt x / 2)"
2541+ (concatStreamsWith parallel (value2 * 2) (value2 `div` 2))
2542+ ]
2543+ ]
2544+ where
2545+ value2 = round $ sqrt $ (fromIntegral value :: Double)
2546+
2547+
2548+o_1_space_parallel_transformation :: Int -> [Benchmark]
2549+o_1_space_parallel_transformation value =
2550+ [ bgroup
2551+ "parallely"
2552+ [ bgroup
2553+ "transformation"
2554+ [ benchIOSink value "map" $ map' parallely 1
2555+ , benchIOSink value "fmap" $ fmap' parallely 1
2556+ , benchIOSink value "mapM" $ mapM parallely 1
2557+ ]
2558+ ]
2559+ ]
2560+
2561+o_1_space_parallel_outerProductStreams :: Int -> [Benchmark]
2562+o_1_space_parallel_outerProductStreams value =
2563+ [ bgroup
2564+ "parallely"
2565+ [ bgroup
2566+ "outer-product-streams"
2567+ [ benchIO "toNullAp" $ Nested.toNullAp value parallely
2568+ , benchIO "toNull" $ Nested.toNull value parallely
2569+ , benchIO "toNull3" $ Nested.toNull3 value parallely
2570+ , benchIO "filterAllOut" $ Nested.filterAllOut value parallely
2571+ , benchIO "filterAllIn" $ Nested.filterAllIn value parallely
2572+ , benchIO "filterSome" $ Nested.filterSome value parallely
2573+ , benchIO "breakAfterSome" $
2574+ Nested.breakAfterSome value parallely
2575+ ]
2576+ ]
2577+ ]
2578+
2579+o_n_space_parallel_outerProductStreams :: Int -> [Benchmark]
2580+o_n_space_parallel_outerProductStreams value =
2581+ [ bgroup
2582+ "parallely"
2583+ [ bgroup
2584+ "outer-product-streams"
2585+ [ benchIO "toList" $ Nested.toList value parallely
2586+ , benchIO "toListSome" $ Nested.toListSome value parallely
2587+ ]
2588+ ]
2589+ ]