on master help sign in
Split "base" benchmark into per module benchmarks

Also, use module name prefix on the benchmarks.

commit1c57096c3cc506f2977d7373a81020aa77a4e0c2 authorHarendra Kumar <harendra@composewell.com> dateTue 2 Jun 2020, 19:36 (6 years ago) parentae7a025
7 files changed+113−108
bench.sh+21−18 benchmark/Streamly/Benchmark/Data/Stream/BaseStreams.hs−27 benchmark/Streamly/Benchmark/Data/Stream/StreamD.hs+13−18 benchmark/Streamly/Benchmark/Data/Stream/StreamDK.hs+11−10 benchmark/Streamly/Benchmark/Data/Stream/StreamK.hs+23−19 benchmark/lib/Streamly/Benchmark/Common.hs+22−1 benchmark/streamly-benchmarks.cabal+23−15
bench.sh+21−18
@@ -1,12 +1,17 @@
11#!/bin/bash
22
3−SERIAL_O_1="linear base"
4−SERIAL_O_n="serial-o-n-heap serial-o-n-stack serial-o-n-space \
5− base-o-n-heap base-o-n-stack base-o-n-space"
3+SERIAL_O_1="linear"
4+SERIAL_O_n="serial-o-n-heap serial-o-n-stack serial-o-n-space"
65FOLD_BENCHMARKS="fold-o-1-space fold-o-n-heap"
76UNFOLD_BENCHMARKS="unfold-o-1-space unfold-o-n-space"
87
9−SERIAL_BENCHMARKS="$SERIAL_O_1 $SERIAL_O_n $FOLD_BENCHMARKS"
8+SERIAL_BENCHMARKS="\
9+ Data.Stream.StreamD \
10+ Data.Stream.StreamK \
11+ Data.Stream.StreamDK \
12+ $SERIAL_O_1 \
13+ $SERIAL_O_n \
14+ $FOLD_BENCHMARKS"
1015# parallel benchmark-suite is separated because we run it with a higher
1116# heap size limit.
1217CONCURRENT_BENCHMARKS="linear-async linear-rate nested-concurrent parallel concurrent adaptive"
@@ -34,10 +39,10 @@ bench_rts_opts () {
3439 "serial-o-n-stack") echo -n "-T -K1M -M16M" ;;
3540 "serial-o-n-heap") echo -n "-T -K36K -M128M" ;;
3641 "serial-o-n-space") echo -n "-T -K16M -M64M" ;;
37− "base") echo -n "-T -K36K -M16M" ;;
38− "base-o-n-stack") echo -n "-T -K1M -M16M" ;;
39− "base-o-n-heap") echo -n "-T -K36K -M64M" ;;
40− "base-o-n-space") echo -n "-T -K32M -M32M" ;;
42+ */o-1-sp*) echo -n "-T -K36K -M16M" ;;
43+ */o-n-h*) echo -n "-T -K36K -M32M" ;;
44+ */o-n-st*) echo -n "-T -K1M -M16M" ;;
45+ */o-n-sp*) echo -n "-T -K1M -M32M" ;;
4146
4247 *) echo -n "" ;;
4348 esac
@@ -54,10 +59,6 @@ bench_exec () {
5459 "serial-o-n-stack") echo -n "serial" ;;
5560 "serial-o-n-heap") echo -n "serial" ;;
5661 "serial-o-n-space") echo -n "serial" ;;
57− "base") echo -n "base" ;;
58− "base-o-n-stack") echo -n "base" ;;
59− "base-o-n-heap") echo -n "base" ;;
60− "base-o-n-space") echo -n "base" ;;
6162 *) echo -n "$1" ;;
6263 esac
6364}
@@ -73,10 +74,6 @@ bench_gauge_opts () {
7374 "serial-o-n-stack") echo -n "-m prefix o-n-stack" ;;
7475 "serial-o-n-heap") echo -n "-m prefix o-n-heap" ;;
7576 "serial-o-n-space") echo -n "-m prefix o-n-space" ;;
76− "base") echo -n "-m prefix o-1-space" ;;
77− "base-o-n-stack") echo -n "-m prefix o-n-stack" ;;
78− "base-o-n-heap") echo -n "-m prefix o-n-heap" ;;
79− "base-o-n-space") echo -n "-m prefix o-n-space" ;;
8077 *) echo -n "" ;;
8178 esac
8279}
@@ -222,6 +219,12 @@ bench_output_file() {
222219 echo "charts/$bench_name/results.csv"
223220}
224221
222+# $1: command
223+function run_verbose() {
224+ echo "$*"
225+ bash -c "$*"
226+}
227+
225228# --min-duration 0 means exactly one iteration per sample. We use a million
226229# iterations in the benchmarking code explicitly and do not use the iterations
227230# done by the benchmarking tool.
@@ -277,8 +280,8 @@ run_bench () {
277280 SPEED_OPTIONS="--stream-size 10000000 $QUICK_OPTS --include-first-iter"
278281 fi
279282
280− $bench_prog $SPEED_OPTIONS \
281− +RTS $(bench_rts_opts $bench_name) -RTS \
283+ run_verbose $bench_prog $SPEED_OPTIONS \
284+ +RTS $(bench_rts_opts $GAUGE_ARGS) -RTS \
282285 --csvraw=$output_file \
283286 -v 2 \
284287 --measure-with $bench_prog $GAUGE_ARGS \
benchmark/Streamly/Benchmark/Data/Stream/BaseStreams.hsdeleted−27
@@ -1,27 +0,0 @@
1−-- |
2−-- Module : Main
3−-- Copyright : (c) 2018 Harendra Kumar
4−--
5−-- License : BSD3
6−-- Maintainer : streamly@composewell.com
7−
8−import qualified Streamly.Benchmark.Data.Stream.StreamK as K
9−import qualified Streamly.Benchmark.Data.Stream.StreamD as D
10−import qualified Streamly.Benchmark.Data.Stream.StreamDK as DK
11−
12−import Gauge
13−
14−main :: IO ()
15−main =
16− defaultMain $
17− [ bgroup "o-n-stack" o_n_stack
18− , bgroup "o-1-space" o_1_space
19− , bgroup "o-n-heap" o_n_heap
20− , bgroup "o-n-space" o_n_space
21− ]
22− where
23− o_1_space =
24− concat [D.o_1_space, K.o_1_space_list, K.o_1_space, DK.o_1_space]
25− o_n_heap = K.o_n_heap
26− o_n_stack = concat [D.o_n_stack, K.o_n_stack]
27− o_n_space = concat [D.o_n_space, K.o_n_space]
benchmark/Streamly/Benchmark/Data/Stream/StreamD.hs+13−18
@@ -8,30 +8,19 @@
88{-# LANGUAGE FlexibleContexts #-}
99{-# LANGUAGE ScopedTypeVariables #-}
1010
11−module Streamly.Benchmark.Data.Stream.StreamD
12− (
13− o_1_space
14− , o_n_stack
15− , o_n_space
16− )
17−where
11+module Main (main) where
1812
1913import Control.Monad (when)
2014import Data.Maybe (isJust)
21−import Prelude
22− (Monad, Int, (+), ($), (.), return, (>), even, (<=), div,
23− subtract, undefined, Maybe(..), not, (>>=),
24− maxBound, fmap, odd, (==), flip, (<$>), (<*>), round, (/), (**), (<))
15+import Gauge (bench, nfIO, bgroup, Benchmark, defaultMain)
2516import System.Random (randomRIO)
17+import Prelude hiding (tail, mapM_, foldl, last, map, mapM, concatMap, zip)
2618
2719import qualified Prelude as P
28−
2920import qualified Streamly.Internal.Data.Stream.StreamD as S
3021import qualified Streamly.Internal.Data.Unfold as UF
3122
32−import Streamly.Benchmark.Common (benchFold)
33−import Gauge (bench, nfIO, bgroup, Benchmark)
34−
23+import Streamly.Benchmark.Common
3524
3625-- We try to keep the total number of iterations same irrespective of nesting
3726-- of the loops so that the overhead is easy to compare.
@@ -368,9 +357,12 @@ filterAllInNested str = runStream $ do
368357-- Benchmarks
369358-------------------------------------------------------------------------------
370359
360+moduleName :: String
361+moduleName = "Data.Stream.StreamD"
362+
371363o_1_space :: [Benchmark]
372364o_1_space =
373− [ bgroup "streamD"
365+ [ bgroup (o_1_space_prefix moduleName)
374366 [ bgroup "generation"
375367 [ benchFold "unfoldr" toNull sourceUnfoldr
376368 , benchFold "unfoldrM" toNull sourceUnfoldrM
@@ -494,7 +486,7 @@ benchD name f = bench name $ nfIO $ randomRIO (1,1) >>= toNull . f
494486
495487o_n_stack :: [Benchmark]
496488o_n_stack =
497− [ bgroup "streamD"
489+ [ bgroup (o_n_stack_prefix moduleName)
498490 [ bgroup "elimination"
499491 [ benchFold "tail" tail sourceUnfoldrM
500492 , benchFold "nullTail" nullTail sourceUnfoldrM
@@ -527,7 +519,7 @@ o_n_stack =
527519
528520o_n_space :: [Benchmark]
529521o_n_space =
530− [ bgroup "streamD"
522+ [ bgroup (o_n_space_prefix moduleName)
531523 [ bgroup "elimination"
532524 [ benchFold "toList" toList sourceUnfoldrM
533525 ]
@@ -539,3 +531,6 @@ o_n_space =
539531 ]
540532 ]
541533 ]
534+
535+main :: IO ()
536+main = defaultMain $ concat [o_1_space, o_n_stack, o_n_space]
benchmark/Streamly/Benchmark/Data/Stream/StreamDK.hs+11−10
@@ -8,16 +8,11 @@
88{-# LANGUAGE FlexibleContexts #-}
99{-# LANGUAGE ScopedTypeVariables #-}
1010
11−module Streamly.Benchmark.Data.Stream.StreamDK
12− (
13− o_1_space
14− )
15−where
11+module Main (main) where
1612
1713-- import Control.Monad (when)
1814-- import Data.Maybe (isJust)
19−import Prelude
20− (Monad, Int, (+), return, Maybe(..), (>))
15+import Prelude hiding ()
2116-- import qualified Prelude as P
2217-- import qualified Data.List as List
2318
@@ -25,8 +20,8 @@ import qualified Streamly.Internal.Data.Stream.StreamDK as S
2520-- import qualified Streamly.Internal.Data.Stream.Prelude as SP
2621-- import qualified Streamly.Internal.Data.SVar as S
2722
28−import Streamly.Benchmark.Common (benchFold)
29−import Gauge (bgroup, Benchmark)
23+import Streamly.Benchmark.Common
24+import Gauge (bgroup, Benchmark, defaultMain)
3025
3126value :: Int
3227value = 100000
@@ -437,9 +432,12 @@ filterAllInNestedList str = do
437432-- Benchmarks
438433-------------------------------------------------------------------------------
439434
435+moduleName :: String
436+moduleName = "Data.Stream.StreamDK"
437+
440438o_1_space :: [Benchmark]
441439o_1_space =
442− [ bgroup "streamDK"
440+ [ bgroup (o_1_space_prefix moduleName)
443441 [ bgroup "generation"
444442 [ benchFold "unfoldr" toNull sourceUnfoldr
445443 , benchFold "unfoldrM" toNull sourceUnfoldrM
@@ -450,3 +448,6 @@ o_1_space =
450448 ]
451449 ]
452450 ]
451+
452+main :: IO ()
453+main = defaultMain $ concat [o_1_space]
benchmark/Streamly/Benchmark/Data/Stream/StreamK.hs+23−19
@@ -8,23 +8,14 @@
88{-# LANGUAGE FlexibleContexts #-}
99{-# LANGUAGE ScopedTypeVariables #-}
1010
11−module Streamly.Benchmark.Data.Stream.StreamK
12− (
13− o_1_space
14− , o_n_stack
15− , o_n_heap
16− , o_n_space
17− , o_1_space_list
18− )
19−where
11+module Main (main) where
2012
2113import Control.Monad (when)
2214import Data.Maybe (isJust)
23−import Prelude
24− (Monad, Int, (+), ($), (.), return, even, (>), (<=), div,
25− subtract, undefined, Maybe(..), not, (>>=),
26− maxBound, flip, (<$>), (<*>), round, (/), (**), (<), foldr, fmap)
2715import System.Random (randomRIO)
16+import Prelude hiding
17+ (tail, mapM_, foldl, last, map, mapM, concatMap, zip, init)
18+
2819import qualified Prelude as P
2920import qualified Data.List as List
3021
@@ -32,8 +23,9 @@ import qualified Streamly.Internal.Data.Stream.StreamK as S
3223import qualified Streamly.Internal.Data.Stream.Prelude as SP
3324import qualified Streamly.Internal.Data.SVar as S
3425
35−import Streamly.Benchmark.Common (benchFold)
36−import Gauge (bench, nfIO, bgroup, Benchmark)
26+import Gauge (bench, nfIO, bgroup, Benchmark, defaultMain)
27+
28+import Streamly.Benchmark.Common
3729
3830value, value2, value3, value16, maxValue :: Int
3931value = 100000
@@ -416,9 +408,12 @@ filterAllInNestedList str = do
416408-- Benchmarks
417409-------------------------------------------------------------------------------
418410
411+moduleName :: String
412+moduleName = "Data.Stream.StreamK"
413+
419414o_1_space :: [Benchmark]
420415o_1_space =
421− [ bgroup "streamK"
416+ [ bgroup (o_1_space_prefix moduleName)
422417 [ bgroup "generation"
423418 [ benchFold "unfoldr" toNull sourceUnfoldr
424419 , benchFold "unfoldrM" toNull sourceUnfoldrM
@@ -538,7 +533,7 @@ o_1_space =
538533
539534o_n_heap :: [Benchmark]
540535o_n_heap =
541− [ bgroup "streamK"
536+ [ bgroup (o_n_heap_prefix moduleName)
542537 [ bgroup "transformation"
543538 [ benchFold "foldlS" (foldlS 1) sourceUnfoldrM
544539 ]
@@ -551,7 +546,7 @@ benchK name f = bench name $ nfIO $ randomRIO (1,1) >>= toNull . f
551546
552547o_n_stack :: [Benchmark]
553548o_n_stack =
554− [ bgroup "streamK"
549+ [ bgroup (o_n_stack_prefix moduleName)
555550 [ bgroup "elimination"
556551 [ benchFold "tail" tail sourceUnfoldrM
557552 , benchFold "nullTail" nullTail sourceUnfoldrM
@@ -581,7 +576,7 @@ o_n_stack =
581576
582577o_n_space :: [Benchmark]
583578o_n_space =
584− [ bgroup "streamK"
579+ [ bgroup (o_n_space_prefix moduleName)
585580 [ bgroup "elimination"
586581 [ benchFold "toList" toList sourceUnfoldrM
587582 ]
@@ -607,3 +602,12 @@ o_1_space_list =
607602 ]
608603 ]
609604 ]
605+
606+main :: IO ()
607+main = defaultMain $ concat
608+ [ o_1_space
609+ , [bgroup (o_1_space_prefix moduleName) o_1_space_list]
610+ , o_n_stack
611+ , o_n_heap
612+ , o_n_space
613+ ]
benchmark/lib/Streamly/Benchmark/Common.hs+22−1
@@ -11,7 +11,12 @@
1111-- Maintainer : streamly@composewell.com
1212
1313module Streamly.Benchmark.Common
14− ( parseCLIOpts
14+ ( o_1_space_prefix
15+ , o_n_space_prefix
16+ , o_n_heap_prefix
17+ , o_n_stack_prefix
18+
19+ , parseCLIOpts
1520
1621 , benchIOSink1
1722 , benchPure
@@ -47,6 +52,22 @@ import qualified Streamly.Prelude as S
4752import Streamly
4853import Gauge
4954
55+-------------------------------------------------------------------------------
56+-- Benchmark Prefixes
57+-------------------------------------------------------------------------------
58+
59+o_1_space_prefix :: String -> String
60+o_1_space_prefix name = name ++ "/o-1-space"
61+
62+o_n_space_prefix :: String -> String
63+o_n_space_prefix name = name ++ "/o-n-space"
64+
65+o_n_heap_prefix :: String -> String
66+o_n_heap_prefix name = name ++ "/o-n-heap"
67+
68+o_n_stack_prefix :: String -> String
69+o_n_stack_prefix name = name ++ "/o-n-stack"
70+
5071-------------------------------------------------------------------------------
5172-- Benchmarking utilities
5273-------------------------------------------------------------------------------
benchmark/streamly-benchmarks.cabal+23−15
@@ -253,29 +253,37 @@ benchmark parser
253253-- Raw Streams
254254-------------------------------------------------------------------------------
255255
256−library lib-base
257− import: lib-options, bench-depends
258− hs-source-dirs: .
259− exposed-modules:
260− Streamly.Benchmark.Data.Stream.StreamD
261− , Streamly.Benchmark.Data.Stream.StreamK
262− , Streamly.Benchmark.Data.Stream.StreamDK
263− if impl(ghcjs)
264− buildable: False
265− else
266− build-depends: streamly-benchmarks
267− buildable: True
256+benchmark Data.Stream.StreamD
257+ import: bench-options
258+ type: exitcode-stdio-1.0
259+ ghc-options: -rtsopts
260+ hs-source-dirs: Streamly/Benchmark/Data/Stream
261+ main-is: StreamD.hs
262+ if impl(ghcjs)
263+ buildable: False
264+ else
265+ buildable: True
266+
267+benchmark Data.Stream.StreamK
268+ import: bench-options
269+ type: exitcode-stdio-1.0
270+ ghc-options: -rtsopts
271+ hs-source-dirs: Streamly/Benchmark/Data/Stream
272+ main-is: StreamK.hs
273+ if impl(ghcjs)
274+ buildable: False
275+ else
276+ buildable: True
268277
269−benchmark base
278+benchmark Data.Stream.StreamDK
270279 import: bench-options
271280 type: exitcode-stdio-1.0
272281 ghc-options: -rtsopts
273282 hs-source-dirs: Streamly/Benchmark/Data/Stream
274− main-is: BaseStreams.hs
283+ main-is: StreamDK.hs
275284 if impl(ghcjs)
276285 buildable: False
277286 else
278− build-depends: lib-base
279287 buildable: True
280288
281289executable nano-bench