@@ -24,6 +24,9 @@ import qualified Streamly.Internal.Data.Fold as IFL
2424import qualified Streamly.Internal.Prelude as IP
2525import qualified Streamly.Internal.Data.Pipe as Pipe
2626
27+import qualified NestedOps as Nested
28+import qualified NestedUnfoldOps as NestedUnfold
29+
2730import Gauge
2831import Streamly.Benchmark.Common
2932
@@ -70,6 +73,9 @@ benchIOSrc t name f =
7073benchPureSink :: NFData b => Int -> String -> (SerialT Identity Int -> b) -> Benchmark
7174benchPureSink value name f = benchPure name (Ops.sourceUnfoldr value) f
7275
76+benchIO :: (NFData b) => String -> (Int -> IO b) -> Benchmark
77+benchIO name f = bench name $ nfIO $ randomRIO (1,1) >>= f
78+
7379-------------------------------------------------------------------------------
7480--
7581-------------------------------------------------------------------------------
@@ -392,43 +398,76 @@ main = do
392398 , benchIOSrc1 "concatMapWithAppend (2,x/2)"
393399 (Ops.concatMapWithAppend 2 (value `div` 2))
394400 ]
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
409+ ]
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
418+ ]
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.
422+ , bgroup "mixed"
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
427+ ]
428+ , bgroup "mixedX4"
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)
440+ ]
441+ ]
442+ , bgroup "wSerially"
443+ [ bgroup "transformation"
444+ [ benchIOSink value "fmap" $ Ops.fmap' wSerially 1
445+ ]
446+ , bgroup "concatMap"
396447 [ benchIOSrc1 "concatMapWithWSerial (2,x/2)"
397448 (Ops.concatMapWithWSerial 2 (value `div` 2))
398449 , benchIOSrc1 "concatMapWithWSerial (x/2,2)"
399450 (Ops.concatMapWithWSerial (value `div` 2) 2)
400451 ]
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"
405− [ benchIOSink value "scanl-map" (Ops.scanMap 1)
406− , benchIOSink value "foldl-map" Ops.foldl'ReduceMap
407− , benchIOSink value "sum-product-fold" Ops.sumProductFold
408− , benchIOSink value "sum-product-scan" Ops.sumProductScan
409− ]
410− , bgroup "mixedX4"
411− [ benchIOSink value "scan-map" (Ops.scanMap 4)
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)
422− ]
423− ]
424− , bgroup "wSerially"
425− [ bgroup "transformation"
426− [ benchIOSink value "fmap" $ Ops.fmap' wSerially 1
427− ]
452+ , bgroup "outer-product"
453+ [ benchIO "toNullAp" $ Nested.toNullAp value wSerially
454+ , benchIO "toNull" $ Nested.toNull value wSerially
455+ , benchIO "toNull3" $ Nested.toNull3 value wSerially
456+ , benchIO "filterAllOut" $ Nested.filterAllOut value wSerially
457+ , benchIO "filterAllIn" $ Nested.filterAllIn value wSerially
458+ , benchIO "filterSome" $ Nested.filterSome value wSerially
459+ , benchIO "breakAfterSome" $ Nested.breakAfterSome value wSerially
428460 ]
461+ ]
429462 , bgroup "zipSerially"
430− [ bgroup "transformation"
431− [ benchIOSink value "fmap" $ Ops.fmap' zipSerially 1
432− ]
463+ [ bgroup "transformation"
464+ [ benchIOSink value "fmap" $ Ops.fmap' zipSerially 1
433465 ]
466+ -- XXX needs fixing
467+ {-
468+ , bgroup "outer-product"
469+ [ benchIO "toNullAp" $ Nested.toNullAp value zipSerially
470+ ]
471+ -}
472+ ]
434473 ]