on master help sign in
Categorize o-1/o-n benchmarks correctly
35d888cHarendra Kumar
.hlint.yaml+1−3
@@ -24,14 +24,12 @@
24- ignore: {name: "Use uncurry"}
24- ignore: {name: "Use uncurry"}
25- ignore: {name: "Redundant $!"}
25- ignore: {name: "Redundant $!"}
26- ignore: {name: "Use fmap"}
26- ignore: {name: "Use fmap"}
27+- ignore: {name: "Use ++"}
27
28
28# Warnings ignored in specific places
29# Warnings ignored in specific places
29−- ignore: {name: "Use ++", within: Stream.Transform}
30- ignore: {name: "Use mapM", within: Stream.Transform}
30- ignore: {name: "Use mapM", within: Stream.Transform}
31- ignore: {name: "Use traverse", within: Stream.Transform}
31- ignore: {name: "Use traverse", within: Stream.Transform}
32- ignore: {name: "Redundant <*", within: Stream.Expand}
32- ignore: {name: "Redundant <*", within: Stream.Expand}
33−- ignore: {name: "Use ++", within: Stream.Reduce}
34−- ignore: {name: "Use ++", within: Stream.Split}
35- ignore: {name: "Redundant bracket", within: Stream.Split}
33- ignore: {name: "Redundant bracket", within: Stream.Split}
36- ignore: {name: "Use isDigit", within: Streamly.Internal.Unicode.Parser}
34- ignore: {name: "Use isDigit", within: Streamly.Internal.Unicode.Parser}
37
35
benchmark/Streamly/Benchmark/Data/Fold.hs+1−1
@@ -306,7 +306,6 @@ o_1_space_serial_elimination value =
306 , benchIOSink value "drainBy" (Stream.fold (FL.drainBy return))
306 , benchIOSink value "drainBy" (Stream.fold (FL.drainBy return))
307 , benchIOSink value "drainN" (Stream.fold (FL.drainN value))
307 , benchIOSink value "drainN" (Stream.fold (FL.drainN value))
308 , benchIOSink value "last" (Stream.fold FL.last)
308 , benchIOSink value "last" (Stream.fold FL.last)
309− , benchIOSink value "nub" (Stream.fold FL.nub)
310 , benchIOSink value "length" (Stream.fold FL.length)
309 , benchIOSink value "length" (Stream.fold FL.length)
311 , benchIOSink value "top" (Stream.fold $ FL.top 10)
310 , benchIOSink value "top" (Stream.fold $ FL.top 10)
312 , benchIOSink value "bottom" (Stream.fold $ FL.bottom 10)
311 , benchIOSink value "bottom" (Stream.fold $ FL.bottom 10)
@@ -449,6 +448,7 @@ o_n_heap_serial value =
449 , benchIOSink value "toStreamRev"
448 , benchIOSink value "toStreamRev"
450 (Stream.fold FL.toStreamRev
449 (Stream.fold FL.toStreamRev
451 :: Stream IO a -> IO (Stream Identity a))
450 :: Stream IO a -> IO (Stream Identity a))
451+ , benchIOSink value "nub" (Stream.fold FL.nub)
452 ]
452 ]
453 , bgroup "key-value"
453 , bgroup "key-value"
454 [
454 [
benchmark/Streamly/Benchmark/Data/Fold/Window.hs+24−11
@@ -12,6 +12,7 @@ import qualified Streamly.Internal.Data.Ring.Unboxed as Ring
12import qualified Streamly.Internal.Data.Fold.Window as Window
12import qualified Streamly.Internal.Data.Fold.Window as Window
13import qualified Streamly.Internal.Data.Stream.StreamD as Stream
13import qualified Streamly.Internal.Data.Stream.StreamD as Stream
14
14
15+import Streamly.Benchmark.Common
15import Gauge
16import Gauge
16
17
17{-# INLINE source #-}
18{-# INLINE source #-}
@@ -65,15 +66,9 @@ benchScanWith src len name f =
65benchWithPostscan :: Int -> String -> Fold IO Double a -> Benchmark
66benchWithPostscan :: Int -> String -> Fold IO Double a -> Benchmark
66benchWithPostscan = benchScanWith source
67benchWithPostscan = benchScanWith source
67
68
68−{-# INLINE numElements #-}
69+o_1_space_folds :: Int -> [Benchmark]
69−numElements :: Int
70+o_1_space_folds numElements =
70−numElements = 100000
71−
72−main :: IO ()
73−main =
74− defaultMain
75− [ bgroup
71+ [ bgroup "fold"
76− "fold"
77 [ benchWithFold numElements "minimum (window size 100)"
72 [ benchWithFold numElements "minimum (window size 100)"
78 (Window.minimum 100)
73 (Window.minimum 100)
79 , benchWithFold numElements "minimum (window size 1000)"
74 , benchWithFold numElements "minimum (window size 1000)"
@@ -126,8 +121,11 @@ main =
126 (Window.cumulative (Window.powerSum 2))
121 (Window.cumulative (Window.powerSum 2))
127
122
128 ]
123 ]
124+ ]
125+
126+o_1_space_scans :: Int -> [Benchmark]
127+o_1_space_scans numElements =
129− , bgroup
128+ [ bgroup "scan"
130− "scan"
131 [ benchWithPostscan numElements "minimum (window size 10)"
129 [ benchWithPostscan numElements "minimum (window size 10)"
132 (Window.minimum 10)
130 (Window.minimum 10)
133 -- Below window size 30 the linear search based impl performs better
131 -- Below window size 30 the linear search based impl performs better
@@ -176,3 +174,18 @@ main =
176 (Ring.slidingWindow 1000 (Window.powerSum 2))
174 (Ring.slidingWindow 1000 (Window.powerSum 2))
177 ]
175 ]
178 ]
176 ]
177+
178+moduleName :: String
179+moduleName = "Data.Fold.Window"
180+
181+main :: IO ()
182+main = runWithCLIOpts defaultStreamSize allBenchmarks
183+
184+ where
185+
186+ allBenchmarks value =
187+ [ bgroup (o_1_space_prefix moduleName) $ concat
188+ [ o_1_space_folds value
189+ , o_1_space_scans value
190+ ]
191+ ]
benchmark/Streamly/Benchmark/Data/Parser.hs+8−5
@@ -723,14 +723,11 @@ o_1_space_serial value =
723 , benchIOSink value "dropWhile" $ dropWhile value
723 , benchIOSink value "dropWhile" $ dropWhile value
724 , benchIOSink value "takeStartBy" $ takeStartBy value
724 , benchIOSink value "takeStartBy" $ takeStartBy value
725 , benchIOSink value "takeEndBy_" $ takeEndBy_ value
725 , benchIOSink value "takeEndBy_" $ takeEndBy_ value
726− , benchIOSrc sourceEscapedFrames value "takeFramedByEsc_"
727− $ takeFramedByEsc_ value
728 , benchIOSink value "groupBy" $ groupBy
726 , benchIOSink value "groupBy" $ groupBy
729 , benchIOSink value "groupByRolling" $ groupByRolling
727 , benchIOSink value "groupByRolling" $ groupByRolling
730 , benchIOSink value "wordBy" $ wordBy value
728 , benchIOSink value "wordBy" $ wordBy value
731 , benchIOSink value "sepBy (words)" sepByWords
729 , benchIOSink value "sepBy (words)" sepByWords
732 , benchIOSink value "sepByAll (words)" sepByAllWords
730 , benchIOSink value "sepByAll (words)" sepByAllWords
733− , benchIOSink value "sepBy1" sepBy1
734 , benchIOSink value "sepBy1 (words)" sepByWords1
731 , benchIOSink value "sepBy1 (words)" sepByWords1
735 , benchIOSink value "deintercalate" $ deintercalate value
732 , benchIOSink value "deintercalate" $ deintercalate value
736 , benchIOSink value "deintercalate1" $ deintercalate1 value
733 , benchIOSink value "deintercalate1" $ deintercalate1 value
@@ -748,7 +745,6 @@ o_1_space_serial value =
748 , benchIOSink value "monad2" $ monad value
745 , benchIOSink value "monad2" $ monad value
749 , benchIOSink value "monad4" $ monad4 value
746 , benchIOSink value "monad4" $ monad4 value
750 , benchIOSink value "monad8" $ monad8 value
747 , benchIOSink value "monad8" $ monad8 value
751− , benchIOSink value "monad16" $ monad16 value
752 -- Alternative
748 -- Alternative
753 , benchIOSink value "alt2parseMany" $ altSmall value
749 , benchIOSink value "alt2parseMany" $ altSmall value
754 , benchIOSink value "alt2" $ alt2 value
750 , benchIOSink value "alt2" $ alt2 value
@@ -783,7 +779,6 @@ o_1_space_serial value =
783 , benchIOSink value "shortest" $ shortestAllAny value
779 , benchIOSink value "shortest" $ shortestAllAny value
784 , benchIOSink value "longest" $ longestAllAny value
780 , benchIOSink value "longest" $ longestAllAny value
785 -}
781 -}
786− , benchIOSink value "listEqBy" (listEqBy value)
787 , benchIOSink value "streamEqBy" (streamEqBy value)
782 , benchIOSink value "streamEqBy" (streamEqBy value)
788 ]
783 ]
789
784
@@ -821,13 +816,21 @@ o_n_heap_serial value =
821 -- lookahead benchmark holds the entire input till end
816 -- lookahead benchmark holds the entire input till end
822 benchIOSink value "lookAhead" $ lookAhead value
817 benchIOSink value "lookAhead" $ lookAhead value
823
818
819+ -- o-n-heap because of backtracking
820+ , benchIOSrc sourceEscapedFrames value "takeFramedByEsc_"
821+ $ takeFramedByEsc_ value
822+
824 -- non-linear time complexity (parserD)
823 -- non-linear time complexity (parserD)
825 , benchIOSink value "split_" $ split_ value
824 , benchIOSink value "split_" $ split_ value
825+ -- XXX Takes lot of space when run on a long stream, why?
826+ , benchIOSink value "monad16" $ monad16 value
826
827
827 -- These show non-linear time complexity.
828 -- These show non-linear time complexity.
828 -- They accumulate the results in a list.
829 -- They accumulate the results in a list.
830+ , benchIOSink value "sepBy1" sepBy1
829 , benchIOSink value "manyAlt" manyAlt
831 , benchIOSink value "manyAlt" manyAlt
830 , benchIOSink value "someAlt" someAlt
832 , benchIOSink value "someAlt" someAlt
833+ , benchIOSink value "listEqBy" (listEqBy value)
831 ]
834 ]
832
835
833-- accumulate results in a list in IO
836-- accumulate results in a list in IO
benchmark/Streamly/Benchmark/Data/Stream/Concurrent.hs+1−1
@@ -17,4 +17,4 @@ moduleName = "Data.Stream.Concurrent"
17-------------------------------------------------------------------------------
17-------------------------------------------------------------------------------
18
18
19main :: IO ()
19main :: IO ()
20−main = runWithCLIOpts defaultStreamSize (allBenchmarks moduleName id)
20+main = runWithCLIOpts defaultStreamSize (allBenchmarks moduleName False id)
benchmark/Streamly/Benchmark/Data/Stream/ConcurrentCommon.hs+6−5
@@ -193,15 +193,16 @@ o_1_space_outerProduct value f =
193-- Benchmark sets
193-- Benchmark sets
194-------------------------------------------------------------------------------
194-------------------------------------------------------------------------------
195
195
196−allBenchmarks :: String -> (Config -> Config) -> Int -> [Benchmark]
196+allBenchmarks :: String -> Bool -> (Config -> Config) -> Int -> [Benchmark]
197−allBenchmarks moduleName modifier value =
197+allBenchmarks moduleName wide modifier value =
198 [ bgroup (o_1_space_prefix moduleName) $ concat
198 [ bgroup (o_1_space_prefix moduleName) $ concat
199 [ o_1_space_mapping value modifier
199 [ o_1_space_mapping value modifier
200 , o_1_space_concatFoldable value modifier
200 , o_1_space_concatFoldable value modifier
201 , o_1_space_concatMap value modifier
201 , o_1_space_concatMap value modifier
202− , o_1_space_outerProduct value modifier
203 , o_1_space_joining value modifier
202 , o_1_space_joining value modifier
203+ ] ++ if wide then [] else o_1_space_outerProduct value modifier
204+ , bgroup (o_n_heap_prefix moduleName) $ concat
205+ [ if wide then o_1_space_outerProduct value modifier else []
206+ , o_n_heap_buffering value modifier
204 ]
207 ]
205− , bgroup (o_n_heap_prefix moduleName)
206− (o_n_heap_buffering value modifier)
207 ]
208 ]
benchmark/Streamly/Benchmark/Data/Stream/ConcurrentEager.hs+1−1
@@ -22,4 +22,4 @@ main :: IO ()
22main =
22main =
23 runWithCLIOpts
23 runWithCLIOpts
24 defaultStreamSize
24 defaultStreamSize
25− (allBenchmarks moduleName (Async.eager True))
25+ (allBenchmarks moduleName True (Async.eager True))
benchmark/Streamly/Benchmark/Data/Stream/ConcurrentInterleaved.hs+1−1
@@ -22,4 +22,4 @@ main :: IO ()
22main =
22main =
23 runWithCLIOpts
23 runWithCLIOpts
24 defaultStreamSize
24 defaultStreamSize
25− (allBenchmarks moduleName (Async.interleaved True))
25+ (allBenchmarks moduleName True (Async.interleaved True))
benchmark/Streamly/Benchmark/Data/Stream/ConcurrentOrdered.hs+1−1
@@ -22,4 +22,4 @@ main :: IO ()
22main =
22main =
23 runWithCLIOpts
23 runWithCLIOpts
24 defaultStreamSize
24 defaultStreamSize
25− (allBenchmarks moduleName (Async.ordered True))
25+ (allBenchmarks moduleName False (Async.ordered True))
benchmark/bench-runner/Main.hs+21−13
@@ -47,6 +47,16 @@ rtsOpts exeName benchName0 = unwords [general, exeSpecific, benchSpecific]
47 | "Prelude.WAsync/o-n-space.monad-outer-product." `isPrefixOf` benchName =
47 | "Prelude.WAsync/o-n-space.monad-outer-product." `isPrefixOf` benchName =
48 "-K4M"
48 "-K4M"
49
49
50+ -- This module is dev only now, and can be removed at some point
51+ | "Data.Stream.StreamDK/o-1-space.grouping.classifySessionsOf"
52+ `isPrefixOf` benchName = "-K512K"
53+ | "Data.Stream.StreamDK/o-n-space.foldr.foldrM/"
54+ `isPrefixOf` benchName = "-K4M"
55+ | "Data.Stream.StreamDK/o-n-space.iterated."
56+ `isPrefixOf` benchName = "-K4M -M64M"
57+ | "Data.Stream.StreamDK/o-n-space.traversable."
58+ `isPrefixOf` benchName = "-K2M"
59+
50 -----------------------------------------------------------------------
60 -----------------------------------------------------------------------
51
61
52 | "Data.Stream.StreamD/o-n-space.elimination.toList" == benchName =
62 | "Data.Stream.StreamD/o-n-space.elimination.toList" == benchName =
@@ -63,19 +73,7 @@ rtsOpts exeName benchName0 = unwords [general, exeSpecific, benchSpecific]
63 | "Data.Stream/o-n-space.iterated."
73 | "Data.Stream/o-n-space.iterated."
64 `isPrefixOf` benchName = "-K4M"
74 `isPrefixOf` benchName = "-K4M"
65
75
66− | "Data.Stream.StreamDK/o-1-space.grouping.classifySessionsOf"
67− `isPrefixOf` benchName = "-K512K"
68− | "Data.Stream.StreamDK/o-n-space.foldr.foldrM/"
69− `isPrefixOf` benchName = "-K4M"
70− | "Data.Stream.StreamDK/o-n-space.iterated."
71− `isPrefixOf` benchName = "-K4M -M64M"
72− | "Data.Stream.StreamDK/o-n-space.traversable."
73− `isPrefixOf` benchName = "-K2M"
74−
75− | "Data.Stream.ConcurrentInterleaved/o-1-space.monad-outer-product.toNullAp"
76− `isPrefixOf` benchName = "-M32M"
77−
78− | "Data.Stream.ConcurrentEager/o-1-space.monad-outer-product.toNullAp"
76+ | "Data.Stream.ConcurrentEager/o-n-space.monad-outer-product.toNullAp"
79 `isPrefixOf` benchName = "-M768M"
77 `isPrefixOf` benchName = "-M768M"
80 | "Data.Stream.ConcurrentEager/o-1-space."
78 | "Data.Stream.ConcurrentEager/o-1-space."
81 `isPrefixOf` benchName = "-M128M"
79 `isPrefixOf` benchName = "-M128M"
@@ -89,6 +87,16 @@ rtsOpts exeName benchName0 = unwords [general, exeSpecific, benchSpecific]
89 | "Data.Array.Generic/o-1-space.transformationX4.map"
87 | "Data.Array.Generic/o-1-space.transformationX4.map"
90 `isPrefixOf` benchName = "-M32M"
88 `isPrefixOf` benchName = "-M32M"
91
89
90+ -- XXX For --long option, need to check why so much heap is required.
91+ -- Note, if we remove the chunked stream module we need to keep the
92+ -- chunked stream benchmarks in the stream module.
93+ | "Data.Array.Stream/o-1-space"
94+ `isPrefixOf` benchName = "-K4M -M512M"
95+ -- XXX Takes up to 160MB heap for --long, we use chunked stream for
96+ -- this, so the reason may be related to chunked streams.
97+ | "Data.Parser.ParserK/o-1-space"
98+ `isPrefixOf` benchName = "-K4M -M256M"
99+
92 -----------------------------------------------------------------------
100 -----------------------------------------------------------------------
93
101
94 | "Unicode.Char/o-1-space." `isPrefixOf` benchName = "-M32M"
102 | "Unicode.Char/o-1-space." `isPrefixOf` benchName = "-M32M"