@@ -24,6 +24,9 @@ import qualified Streamly.Internal.Data.Fold as IFL
24import qualified Streamly.Internal.Prelude as IP
24import qualified Streamly.Internal.Prelude as IP
25import qualified Streamly.Internal.Data.Pipe as Pipe
25import qualified Streamly.Internal.Data.Pipe as Pipe
27+import qualified NestedOps as Nested
28+import qualified NestedUnfoldOps as NestedUnfold
27import Gauge
30import Gauge
28import Streamly.Benchmark.Common
31import Streamly.Benchmark.Common
@@ -70,6 +73,9 @@ benchIOSrc t name f =
70benchPureSink :: NFData b => Int -> String -> (SerialT Identity Int -> b) -> Benchmark
73benchPureSink :: NFData b => Int -> String -> (SerialT Identity Int -> b) -> Benchmark
71benchPureSink value name f = benchPure name (Ops.sourceUnfoldr value) f
74benchPureSink value name f = benchPure name (Ops.sourceUnfoldr value) f
76+benchIO :: (NFData b) => String -> (Int -> IO b) -> Benchmark
77+benchIO name f = bench name $ nfIO $ randomRIO (1,1) >>= f
73-------------------------------------------------------------------------------
79-------------------------------------------------------------------------------
75-------------------------------------------------------------------------------
81-------------------------------------------------------------------------------
@@ -392,43 +398,76 @@ main = do
392 , benchIOSrc1 "concatMapWithAppend (2,x/2)"
398 , benchIOSrc1 "concatMapWithAppend (2,x/2)"
393 (Ops.concatMapWithAppend 2 (value `div` 2))
399 (Ops.concatMapWithAppend 2 (value `div` 2))
395− , bgroup "concat-interleave"
401+ , bgroup "outer-product-streams"
402+ [ benchIO "toNullAp" $ Nested.toNullAp value serially
403+ , benchIO "toNull" $ Nested.toNull value serially
404+ , benchIO "toNull3" $ Nested.toNull3 value serially
405+ , benchIO "filterAllOut" $ Nested.filterAllOut value serially
406+ , benchIO "filterAllIn" $ Nested.filterAllIn value serially
407+ , benchIO "filterSome" $ Nested.filterSome value serially
408+ , benchIO "breakAfterSome" $ Nested.breakAfterSome value serially
410+ , bgroup "outer-product-unfolds"
411+ [ benchIO "toNull" $ NestedUnfold.toNull value
412+ , benchIO "toNull3" $ NestedUnfold.toNull3 value
413+ , benchIO "concat" $ NestedUnfold.concat value
414+ , benchIO "filterAllOut" $ NestedUnfold.filterAllOut value
415+ , benchIO "filterAllIn" $ NestedUnfold.filterAllIn value
416+ , benchIO "filterSome" $ NestedUnfold.filterSome value
417+ , benchIO "breakAfterSome" $ NestedUnfold.breakAfterSome value
419+ -- scanl-map and foldl-map are equivalent to the scan and fold in the foldl
420+ -- library. If scan/fold followed by a map is efficient enough we may not
421+ -- need monolithic implementations of these.
423+ [ benchIOSink value "scanl-map" (Ops.scanMap 1)
424+ , benchIOSink value "foldl-map" Ops.foldl'ReduceMap
425+ , benchIOSink value "sum-product-fold" Ops.sumProductFold
426+ , benchIOSink value "sum-product-scan" Ops.sumProductScan
429+ [ benchIOSink value "scan-map" (Ops.scanMap 4)
430+ , benchIOSink value "drop-map" (Ops.dropMap 4)
431+ , benchIOSink value "drop-scan" (Ops.dropScan 4)
432+ , benchIOSink value "take-drop" (Ops.takeDrop value 4)
433+ , benchIOSink value "take-scan" (Ops.takeScan value 4)
434+ , benchIOSink value "take-map" (Ops.takeMap value 4)
435+ , benchIOSink value "filter-drop" (Ops.filterDrop value 4)
436+ , benchIOSink value "filter-take" (Ops.filterTake value 4)
437+ , benchIOSink value "filter-scan" (Ops.filterScan 4)
438+ , benchIOSink value "filter-scanl1" (Ops.filterScanl1 4)
439+ , benchIOSink value "filter-map" (Ops.filterMap value 4)
442+ , bgroup "wSerially"
443+ [ bgroup "transformation"
444+ [ benchIOSink value "fmap" $ Ops.fmap' wSerially 1
446+ , bgroup "concatMap"
396 [ benchIOSrc1 "concatMapWithWSerial (2,x/2)"
447 [ benchIOSrc1 "concatMapWithWSerial (2,x/2)"
397 (Ops.concatMapWithWSerial 2 (value `div` 2))
448 (Ops.concatMapWithWSerial 2 (value `div` 2))
398 , benchIOSrc1 "concatMapWithWSerial (x/2,2)"
449 , benchIOSrc1 "concatMapWithWSerial (x/2,2)"
399 (Ops.concatMapWithWSerial (value `div` 2) 2)
450 (Ops.concatMapWithWSerial (value `div` 2) 2)
401− -- scanl-map and foldl-map are equivalent to the scan and fold in the foldl
402− -- library. If scan/fold followed by a map is efficient enough we may not
403− -- need monolithic implementations of these.
404− , bgroup "mixed"
452+ , bgroup "outer-product"
405− [ benchIOSink value "scanl-map" (Ops.scanMap 1)
453+ [ benchIO "toNullAp" $ Nested.toNullAp value wSerially
406− , benchIOSink value "foldl-map" Ops.foldl'ReduceMap
454+ , benchIO "toNull" $ Nested.toNull value wSerially
407− , benchIOSink value "sum-product-fold" Ops.sumProductFold
455+ , benchIO "toNull3" $ Nested.toNull3 value wSerially
408− , benchIOSink value "sum-product-scan" Ops.sumProductScan
456+ , benchIO "filterAllOut" $ Nested.filterAllOut value wSerially
409− ]
457+ , benchIO "filterAllIn" $ Nested.filterAllIn value wSerially
410− , bgroup "mixedX4"
458+ , benchIO "filterSome" $ Nested.filterSome value wSerially
411− [ benchIOSink value "scan-map" (Ops.scanMap 4)
459+ , benchIO "breakAfterSome" $ Nested.breakAfterSome value wSerially
412− , benchIOSink value "drop-map" (Ops.dropMap 4)
413− , benchIOSink value "drop-scan" (Ops.dropScan 4)
414− , benchIOSink value "take-drop" (Ops.takeDrop value 4)
415− , benchIOSink value "take-scan" (Ops.takeScan value 4)
416− , benchIOSink value "take-map" (Ops.takeMap value 4)
417− , benchIOSink value "filter-drop" (Ops.filterDrop value 4)
418− , benchIOSink value "filter-take" (Ops.filterTake value 4)
419− , benchIOSink value "filter-scan" (Ops.filterScan 4)
420− , benchIOSink value "filter-scanl1" (Ops.filterScanl1 4)
421− , benchIOSink value "filter-map" (Ops.filterMap value 4)
424− , bgroup "wSerially"
425− [ bgroup "transformation"
426− [ benchIOSink value "fmap" $ Ops.fmap' wSerially 1
429 , bgroup "zipSerially"
462 , bgroup "zipSerially"
430− [ bgroup "transformation"
463+ [ bgroup "transformation"
431− [ benchIOSink value "fmap" $ Ops.fmap' zipSerially 1
464+ [ benchIOSink value "fmap" $ Ops.fmap' zipSerially 1
468+ , bgroup "outer-product"
469+ [ benchIO "toNullAp" $ Nested.toNullAp value zipSerially