on master help sign in
Add benchmarks for unboxed ring array
commit6273643c2d7d4fa6e7d80235235d1429d2721b8c authorAdithya Kumar <adithya@composewell.com> dateMon 11 Jul 2022, 13:23 (4 years ago) parentaaa279c
4 files changed+84−1
benchmark/Streamly/Benchmark/Data/Ring/Unboxed.hs+70 benchmark/lib/Streamly/Benchmark/Common.hs+2−1 benchmark/streamly-benchmarks.cabal+11 streamly.cabal+1
benchmark/Streamly/Benchmark/Data/Ring/Unboxed.hsnew file+70
@@ -0,0 +1,70 @@
1+-- |
2+-- Module : Streamly.Benchmark.Data.Ring.Unboxed
3+-- Copyright : (c) 2022 Composewell
4+-- License : BSD-3-Clause
5+-- Maintainer : streamly@composewell.com
6+
7+{-# LANGUAGE FlexibleContexts #-}
8+{-# LANGUAGE RankNTypes #-}
9+{-# LANGUAGE ScopedTypeVariables #-}
10+
11+module Main (main) where
12+
13+import Control.Monad (void)
14+import GHC.Ptr (Ptr(..))
15+
16+import qualified Streamly.Internal.Data.Array.Foreign.Type as Array
17+import qualified Streamly.Internal.Data.Ring.Foreign as Ring
18+import qualified Data.Foldable as P
19+
20+import Gauge
21+import Streamly.Benchmark.Common
22+
23+import Prelude as P
24+
25+-------------------------------------------------------------------------------
26+-- Benchmark ops
27+-------------------------------------------------------------------------------
28+
29+unsafeEqArrayN :: (Int, Array.Array Int, (Ring.Ring Int, Ptr Int)) -> Bool
30+unsafeEqArrayN (value, arr, (ring, rh)) = Ring.unsafeEqArrayN ring rh arr value
31+
32+unsafeEqArray :: (Array.Array Int, (Ring.Ring Int, Ptr Int)) -> Bool
33+unsafeEqArray (arr, (ring, rh)) = Ring.unsafeEqArray ring rh arr
34+
35+-------------------------------------------------------------------------------
36+-- Benchmark groups
37+-------------------------------------------------------------------------------
38+
39+o_1_space_serial ::
40+ Int -> Array.Array Int -> (Ring.Ring Int, Ptr Int) -> [Benchmark]
41+o_1_space_serial value arr (ring, rh) =
42+ [ bench "unsafeEqArrayN" $ nf unsafeEqArrayN (value, arr, (ring, rh))
43+ , bench "unsafeEqArray" $ nf unsafeEqArray (arr, (ring, rh))
44+ ]
45+
46+-------------------------------------------------------------------------------
47+-- Main
48+-------------------------------------------------------------------------------
49+
50+moduleName :: String
51+moduleName = "Data.Ring.Unboxed"
52+
53+main :: IO ()
54+main = do
55+ runWithCLIOptsEnv defaultStreamSize alloc allBenchmarks
56+
57+ where
58+
59+ alloc value = do
60+ let input = [1 .. value] :: [Int]
61+ let arr = Array.fromList input
62+ (ring, rh) <- Ring.new value
63+ void $ P.foldlM (Ring.unsafeInsert ring) rh input
64+ return (arr, (ring, rh))
65+
66+ allBenchmarks (arr, (ring, rh)) value =
67+ [ bgroup
68+ (o_1_space_prefix moduleName)
69+ (o_1_space_serial value arr (ring, rh))
70+ ]
benchmark/lib/Streamly/Benchmark/Common.hs+2−1
@@ -237,8 +237,9 @@ runWithCLIOptsEnv defStreamSize alloc mkBench = do
237237 r <- alloc value
238238 value `seq` runMode (mode cfg) cfg benches (mkBench r value)
239239#else
240+ r0 <- alloc 0
240241 (value, ingredients) <-
241− parseCLIOpts defStreamSize $ bgroup "All" (mkBench undefined 0)
242+ parseCLIOpts defStreamSize $ bgroup "All" (mkBench r0 0)
242243 r <- alloc value
243244 value `seq` defaultMainWithIngredients ingredients
244245 $ bgroup "All" (mkBench r value)
benchmark/streamly-benchmarks.cabal+11
@@ -544,6 +544,17 @@ benchmark Data.Array.Foreign.Mut
544544 else
545545 buildable: True
546546
547+-------------------------------------------------------------------------------
548+-- Ring Benchmarks
549+-------------------------------------------------------------------------------
550+
551+benchmark Data.Ring.Unboxed
552+ import: bench-options
553+ type: exitcode-stdio-1.0
554+ main-is: Streamly/Benchmark/Data/Ring/Unboxed.hs
555+ if flag(limit-build-mem)
556+ ghc-options: +RTS -M1500M -RTS
557+
547558-------------------------------------------------------------------------------
548559-- Array Stream Benchmarks
549560-------------------------------------------------------------------------------
streamly.cabal+1
@@ -56,6 +56,7 @@ extra-source-files:
5656 benchmark/Streamly/Benchmark/Data/Array/CommonImports.hs
5757 benchmark/Streamly/Benchmark/Data/Array/SmallArray.hs
5858 benchmark/Streamly/Benchmark/Data/Array/Foreign.hs
59+ benchmark/Streamly/Benchmark/Data/Ring/Unboxed.hs
5960 benchmark/Streamly/Benchmark/Data/Array/Foreign/Mut.hs
6061 benchmark/Streamly/Benchmark/Data/Array/Prim.hs
6162 benchmark/Streamly/Benchmark/Data/Array/Prim/Pinned.hs