on master help sign in
Add code to check fusion in Stream benchmarks
commit2562e3e111c806794ac019139d223b3d9dd45832 authorHarendra Kumar <harendra@composewell.com> dateTue 7 Mar 2023, 23:00 (4 years ago) parent430f06d
1 file changed+49
benchmark/Streamly/Benchmark/Data/Stream.hs+49
benchmark/Streamly/Benchmark/Data/Stream.hs+49
@@ -9,6 +9,11 @@
99{-# LANGUAGE ScopedTypeVariables #-}
1010{-# LANGUAGE RankNTypes #-}
1111
12+#undef FUSION_CHECK
13+#ifdef FUSION_CHECK
14+{-# OPTIONS_GHC -ddump-simpl -ddump-to-file -dsuppress-all #-}
15+#endif
16+
1217module Main (main) where
1318
1419import Streamly.Benchmark.Common.Handle (mkHandleBenchEnv)
@@ -28,6 +33,15 @@ import qualified Stream.Transform as Transformation
2833
2934import Streamly.Benchmark.Common
3035
36+#ifdef FUSION_CHECK
37+import Data.Function ((&))
38+import Streamly.Data.Stream (Stream)
39+import qualified Streamly.Internal.Data.Stream.StreamD as Stream
40+import qualified Streamly.Internal.Data.Fold as Fold
41+import qualified Data.Foldable as Foldable
42+import Stream.Common
43+#endif
44+
3145moduleName :: String
3246#ifdef USE_STREAMK
3347moduleName = "Data.Stream.StreamDK"
@@ -44,6 +58,7 @@ moduleName = "Data.Stream"
4458--
4559main :: IO ()
4660main = do
61+#ifndef FUSION_CHECK
4762 env <- mkHandleBenchEnv
4863 runWithCLIOpts defaultStreamSize (allBenchmarks env)
4964
@@ -63,3 +78,37 @@ main = do
6378 , Lift.benchmarks moduleName size
6479 , NestedStream.benchmarks moduleName size
6580 ]
81+#else
82+ -- Enable FUSION_CHECK macro at the beginning of the file
83+ -- Enable one benchmark below, and run the benchmark
84+ -- Check the .dump-simpl output
85+ let value = 100000
86+ let input = sourceUnfoldrM value 1
87+
88+ -- Stream.foldr (:) [] input >>= print . Prelude.length
89+ -- Stream.fold (Fold.foldr' (:) []) input >>= print . Prelude.length
90+
91+ -- Stream.toList input >>= print . Prelude.length
92+ -- Stream.fold Fold.toList input >>= print . Prelude.length
93+
94+ -- We can automatically assert that these generate identical core
95+
96+ -- Stream.drain input >>= print
97+ -- Stream.fold Fold.drain input >>= print
98+
99+ -- Stream.last input >>= print
100+ -- Stream.fold Fold.latest input >>= print
101+
102+ -- Stream.length input >>= print
103+ -- Stream.fold Fold.length input >>= print
104+
105+ -- Stream.maximum input >>= print
106+ -- Stream.fold Fold.maximum input >>= print
107+
108+ -- Stream.head input >>= print
109+ -- Stream.fold Fold.one input >>= print
110+
111+ -- composeN 4 (Stream.scanl' (+) 0) input
112+ composeN 4 (Stream.scan (Fold.foldl' (+) 0)) input
113+ return ()
114+#endif