packages feed

word-array-0.1.0.0: bench/Main.hs

{-# LANGUAGE
    BangPatterns
  , GADTs
  , DeriveGeneric
  , StandaloneDeriving
  , MagicHash
  , DataKinds
  , GeneralizedNewtypeDeriving
  , TypeApplications
  , ScopedTypeVariables
#-}

{-# OPTIONS_GHC
    -fno-warn-orphans
#-}

import Control.Monad.Primitive
import Data.Functor.Identity (Identity(Identity))
import Data.Primitive
import Data.Word
import Data.Word64Array.Word8
import Test.Tasty.Bench (bench, bgroup, defaultMain, env, nf, nfIO)
import Control.DeepSeq (deepseq, NFData (rnf))
import Control.Monad.Trans.State.Strict

{-# NOINLINE someArray #-}
someArray :: WordArray
someArray = toWordArray (maxBound `div` 2)

{-# NOINLINE mkPrimArray #-}
mkPrimArray :: IO (MutablePrimArray (PrimState IO) Word8)
mkPrimArray = do
  arr <- newPrimArray 7
  setPrimArray arr 0 7 (0 :: Word8)
  pure arr

{-# INLINE overIndexPA #-}
overIndexPA :: (Prim a, PrimMonad m) => Int -> (a -> a) -> MutablePrimArray (PrimState m) a -> m ()
overIndexPA i f arr = do
  v <- readPrimArray arr i
  writePrimArray arr i (f v)

{-# NOINLINE iforPrimArray #-}
iforPrimArray :: (Prim a, PrimMonad m) => MutablePrimArray (PrimState m) a -> (Int -> a -> m ()) -> m ()
iforPrimArray arr f = do
  readPrimArray arr 0 >>= f 0
  readPrimArray arr 1 >>= f 1
  readPrimArray arr 2 >>= f 2
  readPrimArray arr 3 >>= f 3
  readPrimArray arr 4 >>= f 4
  readPrimArray arr 5 >>= f 5
  readPrimArray arr 6 >>= f 6
  readPrimArray arr 7 >>= f 7

{-# NOINLINE iforWordArray' #-}
iforWordArray' :: Applicative f => WordArray
  -> (Int -> Word8 -> f ())
  -> f ()
iforWordArray' = iforWordArray

sumState :: Monad m => Int -> Word8 -> StateT Int m ()
sumState i w = 
  modify $ \s -> i + s + fromIntegral w

main :: IO ()
main = do

  defaultMain
    [ bgroup "word-array"
        [ bench "overIndex" $ nf (overIndex 0 (+1)) someArray
        , bench "ifor" $ nf (flip iforWordArray (\i w -> i `deepseq` w `deepseq` Identity ())) (toWordArray maxBound)
        , bench "ifor sum" $ nf (flip runState 0 . flip iforWordArray sumState) (toWordArray maxBound)
        ]
      , bgroup "prim-array"
        [ env mkPrimArray $ \arr -> bench "overIndex" $ nfIO (overIndexPA 0 (+1) arr)
        , env mkPrimArray $ \arr -> bench "ifor" $ nfIO (iforPrimArray arr (\i w -> i `deepseq` w `deepseq` pure ()))
        , env mkPrimArray $ \arr -> bench "ifor sum" $ nfIO $ do
            (_, !i) <- flip runStateT 0 $ iforPrimArray arr sumState
            pure i
        ]
    ]