on master help sign in
Categorize o-1/o-n benchmarks correctly
commit35d888c2f9484aea2ae3da3ee87e6f032862d062 authorHarendra Kumar <harendra@composewell.com> dateThu 9 Mar 2023, 16:21 (4 years ago) parent86cc020
10 files changed+65−42
.hlint.yaml+1−3 benchmark/Streamly/Benchmark/Data/Fold.hs+1−1 benchmark/Streamly/Benchmark/Data/Fold/Window.hs+24−11 benchmark/Streamly/Benchmark/Data/Parser.hs+8−5 benchmark/Streamly/Benchmark/Data/Stream/Concurrent.hs+1−1 benchmark/Streamly/Benchmark/Data/Stream/ConcurrentCommon.hs+6−5 benchmark/Streamly/Benchmark/Data/Stream/ConcurrentEager.hs+1−1 benchmark/Streamly/Benchmark/Data/Stream/ConcurrentInterleaved.hs+1−1 benchmark/Streamly/Benchmark/Data/Stream/ConcurrentOrdered.hs+1−1 benchmark/bench-runner/Main.hs+21−13
.hlint.yaml+1−3
@@ -24,14 +24,12 @@
2424- ignore: {name: "Use uncurry"}
2525- ignore: {name: "Redundant $!"}
2626- ignore: {name: "Use fmap"}
27+- ignore: {name: "Use ++"}
2728
2829# Warnings ignored in specific places
29−- ignore: {name: "Use ++", within: Stream.Transform}
3030- ignore: {name: "Use mapM", within: Stream.Transform}
3131- ignore: {name: "Use traverse", within: Stream.Transform}
3232- ignore: {name: "Redundant <*", within: Stream.Expand}
33−- ignore: {name: "Use ++", within: Stream.Reduce}
34−- ignore: {name: "Use ++", within: Stream.Split}
3533- ignore: {name: "Redundant bracket", within: Stream.Split}
3634- ignore: {name: "Use isDigit", within: Streamly.Internal.Unicode.Parser}
3735
benchmark/Streamly/Benchmark/Data/Fold.hs+1−1
@@ -306,7 +306,6 @@ o_1_space_serial_elimination value =
306306 , benchIOSink value "drainBy" (Stream.fold (FL.drainBy return))
307307 , benchIOSink value "drainN" (Stream.fold (FL.drainN value))
308308 , benchIOSink value "last" (Stream.fold FL.last)
309− , benchIOSink value "nub" (Stream.fold FL.nub)
310309 , benchIOSink value "length" (Stream.fold FL.length)
311310 , benchIOSink value "top" (Stream.fold $ FL.top 10)
312311 , benchIOSink value "bottom" (Stream.fold $ FL.bottom 10)
@@ -449,6 +448,7 @@ o_n_heap_serial value =
449448 , benchIOSink value "toStreamRev"
450449 (Stream.fold FL.toStreamRev
451450 :: Stream IO a -> IO (Stream Identity a))
451+ , benchIOSink value "nub" (Stream.fold FL.nub)
452452 ]
453453 , bgroup "key-value"
454454 [
benchmark/Streamly/Benchmark/Data/Fold/Window.hs+24−11
@@ -12,6 +12,7 @@ import qualified Streamly.Internal.Data.Ring.Unboxed as Ring
1212import qualified Streamly.Internal.Data.Fold.Window as Window
1313import qualified Streamly.Internal.Data.Stream.StreamD as Stream
1414
15+import Streamly.Benchmark.Common
1516import Gauge
1617
1718{-# INLINE source #-}
@@ -65,15 +66,9 @@ benchScanWith src len name f =
6566benchWithPostscan :: Int -> String -> Fold IO Double a -> Benchmark
6667benchWithPostscan = benchScanWith source
6768
68−{-# INLINE numElements #-}
69−numElements :: Int
70−numElements = 100000
71−
72−main :: IO ()
73−main =
74− defaultMain
75− [ bgroup
76− "fold"
69+o_1_space_folds :: Int -> [Benchmark]
70+o_1_space_folds numElements =
71+ [ bgroup "fold"
7772 [ benchWithFold numElements "minimum (window size 100)"
7873 (Window.minimum 100)
7974 , benchWithFold numElements "minimum (window size 1000)"
@@ -126,8 +121,11 @@ main =
126121 (Window.cumulative (Window.powerSum 2))
127122
128123 ]
129− , bgroup
130− "scan"
124+ ]
125+
126+o_1_space_scans :: Int -> [Benchmark]
127+o_1_space_scans numElements =
128+ [ bgroup "scan"
131129 [ benchWithPostscan numElements "minimum (window size 10)"
132130 (Window.minimum 10)
133131 -- Below window size 30 the linear search based impl performs better
@@ -176,3 +174,18 @@ main =
176174 (Ring.slidingWindow 1000 (Window.powerSum 2))
177175 ]
178176 ]
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 =
723723 , benchIOSink value "dropWhile" $ dropWhile value
724724 , benchIOSink value "takeStartBy" $ takeStartBy value
725725 , benchIOSink value "takeEndBy_" $ takeEndBy_ value
726− , benchIOSrc sourceEscapedFrames value "takeFramedByEsc_"
727− $ takeFramedByEsc_ value
728726 , benchIOSink value "groupBy" $ groupBy
729727 , benchIOSink value "groupByRolling" $ groupByRolling
730728 , benchIOSink value "wordBy" $ wordBy value
731729 , benchIOSink value "sepBy (words)" sepByWords
732730 , benchIOSink value "sepByAll (words)" sepByAllWords
733− , benchIOSink value "sepBy1" sepBy1
734731 , benchIOSink value "sepBy1 (words)" sepByWords1
735732 , benchIOSink value "deintercalate" $ deintercalate value
736733 , benchIOSink value "deintercalate1" $ deintercalate1 value
@@ -748,7 +745,6 @@ o_1_space_serial value =
748745 , benchIOSink value "monad2" $ monad value
749746 , benchIOSink value "monad4" $ monad4 value
750747 , benchIOSink value "monad8" $ monad8 value
751− , benchIOSink value "monad16" $ monad16 value
752748 -- Alternative
753749 , benchIOSink value "alt2parseMany" $ altSmall value
754750 , benchIOSink value "alt2" $ alt2 value
@@ -783,7 +779,6 @@ o_1_space_serial value =
783779 , benchIOSink value "shortest" $ shortestAllAny value
784780 , benchIOSink value "longest" $ longestAllAny value
785781 -}
786− , benchIOSink value "listEqBy" (listEqBy value)
787782 , benchIOSink value "streamEqBy" (streamEqBy value)
788783 ]
789784
@@ -821,13 +816,21 @@ o_n_heap_serial value =
821816 -- lookahead benchmark holds the entire input till end
822817 benchIOSink value "lookAhead" $ lookAhead value
823818
819+ -- o-n-heap because of backtracking
820+ , benchIOSrc sourceEscapedFrames value "takeFramedByEsc_"
821+ $ takeFramedByEsc_ value
822+
824823 -- non-linear time complexity (parserD)
825824 , benchIOSink value "split_" $ split_ value
825+ -- XXX Takes lot of space when run on a long stream, why?
826+ , benchIOSink value "monad16" $ monad16 value
826827
827828 -- These show non-linear time complexity.
828829 -- They accumulate the results in a list.
830+ , benchIOSink value "sepBy1" sepBy1
829831 , benchIOSink value "manyAlt" manyAlt
830832 , benchIOSink value "someAlt" someAlt
833+ , benchIOSink value "listEqBy" (listEqBy value)
831834 ]
832835
833836-- accumulate results in a list in IO
benchmark/Streamly/Benchmark/Data/Stream/Concurrent.hs+1−1
@@ -17,4 +17,4 @@ moduleName = "Data.Stream.Concurrent"
1717-------------------------------------------------------------------------------
1818
1919main :: 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 =
193193-- Benchmark sets
194194-------------------------------------------------------------------------------
195195
196−allBenchmarks :: String -> (Config -> Config) -> Int -> [Benchmark]
197−allBenchmarks moduleName modifier value =
196+allBenchmarks :: String -> Bool -> (Config -> Config) -> Int -> [Benchmark]
197+allBenchmarks moduleName wide modifier value =
198198 [ bgroup (o_1_space_prefix moduleName) $ concat
199199 [ o_1_space_mapping value modifier
200200 , o_1_space_concatFoldable value modifier
201201 , o_1_space_concatMap value modifier
202− , o_1_space_outerProduct value modifier
203202 , 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
204207 ]
205− , bgroup (o_n_heap_prefix moduleName)
206− (o_n_heap_buffering value modifier)
207208 ]
benchmark/Streamly/Benchmark/Data/Stream/ConcurrentEager.hs+1−1
@@ -22,4 +22,4 @@ main :: IO ()
2222main =
2323 runWithCLIOpts
2424 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 ()
2222main =
2323 runWithCLIOpts
2424 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 ()
2222main =
2323 runWithCLIOpts
2424 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]
4747 | "Prelude.WAsync/o-n-space.monad-outer-product." `isPrefixOf` benchName =
4848 "-K4M"
4949
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+
5060 -----------------------------------------------------------------------
5161
5262 | "Data.Stream.StreamD/o-n-space.elimination.toList" == benchName =
@@ -63,19 +73,7 @@ rtsOpts exeName benchName0 = unwords [general, exeSpecific, benchSpecific]
6373 | "Data.Stream/o-n-space.iterated."
6474 `isPrefixOf` benchName = "-K4M"
6575
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"
7977 `isPrefixOf` benchName = "-M768M"
8078 | "Data.Stream.ConcurrentEager/o-1-space."
8179 `isPrefixOf` benchName = "-M128M"
@@ -89,6 +87,16 @@ rtsOpts exeName benchName0 = unwords [general, exeSpecific, benchSpecific]
8987 | "Data.Array.Generic/o-1-space.transformationX4.map"
9088 `isPrefixOf` benchName = "-M32M"
9189
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+
92100 -----------------------------------------------------------------------
93101
94102 | "Unicode.Char/o-1-space." `isPrefixOf` benchName = "-M32M"