streamly-0.10.0: benchmark/Streamly/Benchmark/Data/Ring/Unboxed.hs
-- |
-- Module : Streamly.Benchmark.Data.Ring.Unboxed
-- Copyright : (c) 2022 Composewell
-- License : BSD-3-Clause
-- Maintainer : streamly@composewell.com
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main (main) where
import Control.Monad (void)
import GHC.Ptr (Ptr(..))
import qualified Streamly.Internal.Data.Array as Array
import qualified Streamly.Internal.Data.Ring as Ring
import qualified Data.Foldable as P
import Test.Tasty.Bench
import Streamly.Benchmark.Common
import Prelude as P
-------------------------------------------------------------------------------
-- Benchmark ops
-------------------------------------------------------------------------------
unsafeEqArrayN :: (Int, Array.Array Int, (Ring.Ring Int, Ptr Int)) -> Bool
unsafeEqArrayN (value, arr, (ring, rh)) = Ring.unsafeEqArrayN ring rh arr value
unsafeEqArray :: (Array.Array Int, (Ring.Ring Int, Ptr Int)) -> Bool
unsafeEqArray (arr, (ring, rh)) = Ring.unsafeEqArray ring rh arr
-------------------------------------------------------------------------------
-- Benchmark groups
-------------------------------------------------------------------------------
o_1_space_serial ::
Int -> Array.Array Int -> (Ring.Ring Int, Ptr Int) -> [Benchmark]
o_1_space_serial value arr (ring, rh) =
[ bench "unsafeEqArrayN" $ nf unsafeEqArrayN (value, arr, (ring, rh))
, bench "unsafeEqArray" $ nf unsafeEqArray (arr, (ring, rh))
]
-------------------------------------------------------------------------------
-- Main
-------------------------------------------------------------------------------
moduleName :: String
moduleName = "Data.Ring.Unboxed"
main :: IO ()
main = do
runWithCLIOptsEnv defaultStreamSize alloc allBenchmarks
where
alloc value = do
let input = [1 .. value] :: [Int]
let arr = Array.fromList input
(ring, rh) <- Ring.new value
void $ P.foldlM (Ring.unsafeInsert ring) rh input
return (arr, (ring, rh))
allBenchmarks (arr, (ring, rh)) value =
[ bgroup
(o_1_space_prefix moduleName)
(o_1_space_serial value arr (ring, rh))
]