{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE ScopedTypeVariables #-} module Main (main) where import Criterion.Main import Data.Prim.Memory import Data.Prim.Memory.Addr import Data.Prim.Memory.Bytes import Data.Prim.Memory.ByteString import Data.Prim.Memory.PArray import qualified Data.Primitive.ByteArray as BA import Data.Primitive.PrimArray main :: IO () main = do let n = 1000000 :: Count a n64 = n :: Count Word64 -- Ensure that arrays are equal by filling them with zeros bEq1 <- freezeMBytes =<< allocZeroAlignedMBytes n64 bEq2 <- freezeMBytes =<< allocZeroAlignedMBytes n64 mbaEq1 <- BA.newAlignedPinnedByteArray (unCountBytes (n :: Count Word64)) 8 mbaEq2 <- BA.newAlignedPinnedByteArray (unCountBytes (n :: Count Word64)) 8 BA.setByteArray mbaEq1 0 (unCount n64) (0 :: Word64) BA.setByteArray mbaEq2 0 (unCount n64) (0 :: Word64) baEq1 <- BA.unsafeFreezeByteArray mbaEq1 baEq2 <- BA.unsafeFreezeByteArray mbaEq2 let paEq1 = PArray bEq1 :: PArray 'Pin Word64 paEq2 = PArray bEq2 :: PArray 'Pin Word64 bsEq1 = convertMem bEq1 :: ByteString bsEq2 = convertMem bEq2 :: ByteString addrEq1 = fromBytesAddr bEq1 :: Addr Word64 addrEq2 = fromBytesAddr bEq2 :: Addr Word64 primEq1 = PrimArray (toByteArray# bEq1) :: PrimArray Word64 primEq2 = PrimArray (toByteArray# bEq2) :: PrimArray Word64 pa8Eq1 = PArray bEq1 :: PArray 'Pin Word8 pa8Eq2 = PArray bEq2 :: PArray 'Pin Word8 addr8Eq1 = fromBytesAddr bEq1 :: Addr Word8 addr8Eq2 = fromBytesAddr bEq2 :: Addr Word8 prim8Eq1 = PrimArray (toByteArray# bEq1) :: PrimArray Word8 prim8Eq2 = PrimArray (toByteArray# bEq2) :: PrimArray Word8 addr16Eq1 = fromBytesAddr bEq1 :: Addr Word16 addr16Eq2 = fromBytesAddr bEq2 :: Addr Word16 pa16Eq1 = PArray bEq1 :: PArray 'Pin Word16 pa16Eq2 = PArray bEq2 :: PArray 'Pin Word16 prim16Eq1 = PrimArray (toByteArray# bEq1) :: PrimArray Word16 prim16Eq2 = PrimArray (toByteArray# bEq2) :: PrimArray Word16 addr32Eq1 = fromBytesAddr bEq1 :: Addr Word32 addr32Eq2 = fromBytesAddr bEq2 :: Addr Word32 pa32Eq1 = PArray bEq1 :: PArray 'Pin Word32 pa32Eq2 = PArray bEq2 :: PArray 'Pin Word32 prim32Eq1 = PrimArray (toByteArray# bEq1) :: PrimArray Word32 prim32Eq2 = PrimArray (toByteArray# bEq2) :: PrimArray Word32 defaultMain [ bgroup "eq" [ bgroup "Word8" [ bench "Bytes" $ whnf (bEq1 ==) bEq2 , bench "ByteArray" $ whnf (baEq1 ==) baEq2 , bench "ByteString" $ whnf (bsEq1 ==) bsEq2 , bench "Addr" $ whnf (addr8Eq1 ==) addr8Eq2 , bench "PArray" $ whnf (pa8Eq1 ==) pa8Eq2 , bench "PrimArray" $ whnf (prim8Eq1 ==) prim8Eq2 ] , bgroup "Word64" [ bench "Addr" $ whnf (addrEq1 ==) addrEq2 , bench "PArray" $ whnf (paEq1 ==) paEq2 , bench "PrimArray" $ whnf (primEq1 ==) primEq2 ] ] , bgroup "compare" [ bgroup "Word8" [ bench "Bytes" $ whnf (compare bEq1) bEq2 , bench "ByteArray" $ whnf (compare baEq1) baEq2 , bench "ByteString" $ whnf (compare bsEq1) bsEq2 , bench "Addr" $ whnf (compare addr8Eq1) addr8Eq2 , bench "PArray" $ whnf (compare pa8Eq1) pa8Eq2 , bench "PrimArray" $ whnf (compare prim8Eq1) prim8Eq2 ] , bgroup "Word16" [ bench "Addr" $ whnf (compare addr16Eq1) addr16Eq2 , bench "PArray" $ whnf (compare pa16Eq1) pa16Eq2 , bench "PrimArray" $ whnf (compare prim16Eq1) prim16Eq2 ] , bgroup "Word32" [ bench "Addr" $ whnf (compare addr32Eq1) addr32Eq2 , bench "PArray" $ whnf (compare pa32Eq1) pa32Eq2 , bench "PrimArray" $ whnf (compare prim32Eq1) prim32Eq2 ] , bgroup "Word64" [ bench "Addr" $ whnf (compare addrEq1) addrEq2 , bench "PArray" $ whnf (compare paEq1) paEq2 , bench "PrimArray" $ whnf (compare primEq1) primEq2 ] ] ]