@@ -0,0 +1,102 @@
1+{-# LANGUAGE TemplateHaskell #-}
4+-- Module : Streamly.Benchmark.Data.Unbox
5+-- Copyright : (c) 2023 Composewell
6+-- License : BSD-3-Clause
7+-- Maintainer : streamly@composewell.com
9+module Main (main) where
11+-------------------------------------------------------------------------------
13+-------------------------------------------------------------------------------
15+import Control.DeepSeq (NFData(..))
16+import Control.Exception (assert)
17+import Control.Monad (replicateM_)
18+import Data.Proxy (Proxy(..))
19+import GHC.Generics (Generic)
20+import System.Random (randomRIO)
22+import Streamly.Internal.Data.Unbox
23+import Streamly.Internal.Data.Unbox.TH
26+import Streamly.Benchmark.Common
28+-------------------------------------------------------------------------------
30+-------------------------------------------------------------------------------
36+ deriving (Generic, Show, Eq)
37+type CustomDT1_ = CustomDT1 Int Bool
39+instance (Unbox a, Unbox b) => Unbox (CustomDT1 a b)
46+type CustomDT2_ = CustomDT2 Int Bool
48+$(deriveUnbox ''CustomDT2)
50+-------------------------------------------------------------------------------
52+-------------------------------------------------------------------------------
54+serializeDeserializeTimes :: forall a. (Eq a, Unbox a) => a -> Int -> IO ()
55+serializeDeserializeTimes val times = do
56+ arr <- newBytes (sizeOf (Proxy :: Proxy a))
57+ replicateM_ times $ do
58+ pokeByteIndex 0 arr val
59+ val1 <- peekByteIndex 0 arr
60+ assert (val == val1) (pure ())
62+benchSink :: NFData b => String -> Int -> (Int -> IO b) -> Benchmark
63+benchSink name times f = bench name (nfIO (randomRIO (times, times) >>= f))
65+-------------------------------------------------------------------------------
67+-------------------------------------------------------------------------------
69+allBenchmarks :: Int -> [Benchmark]
72+ "serializeDeserializeTimes CDT1C1 (Generic)"
74+ (serializeDeserializeTimes (CDT1C1 :: CustomDT1_))
76+ "serializeDeserializeTimes CDT2C1 (TH)"
78+ (serializeDeserializeTimes (CDT2C1 :: CustomDT2_))
80+ "serializeDeserializeTimes CDT1C2 (Generic)"
82+ (serializeDeserializeTimes ((CDT1C2 (5 :: Int)) :: CustomDT1_))
84+ "serializeDeserializeTimes CDT2C2 (TH)"
86+ (serializeDeserializeTimes ((CDT2C2 (5 :: Int)) :: CustomDT2_))
88+ "serializeDeserializeTimes CDT1C3 (Generic)"
90+ (serializeDeserializeTimes ((CDT1C3 (5 :: Int) True) :: CustomDT1_))
92+ "serializeDeserializeTimes CDT2C3 (TH)"
94+ (serializeDeserializeTimes ((CDT2C3 (5 :: Int) True) :: CustomDT2_))
97+-------------------------------------------------------------------------------
99+-------------------------------------------------------------------------------
102+main = runWithCLIOpts defaultStreamSize allBenchmarks