@@ -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+ ]