-- see also speed test in sample-frame package module Main where import qualified Data.StorableVector as SV import qualified System.TimeIt as T import Foreign.Storable.Newtype as StoreNew import Foreign.Storable.Record as Store import Foreign.Storable (Storable (..), ) import Control.Applicative (liftA2, ) import Data.Word (Word8, ) data MonoN a = MonoN {singleN :: a} deriving Show instance (Storable a) => Storable (MonoN a) where {- INLINE sizeOf -} sizeOf = StoreNew.sizeOf singleN {- INLINE alignment -} alignment = StoreNew.alignment singleN {- INLINE peek -} peek = StoreNew.peek MonoN {- INLINE poke -} poke = StoreNew.poke singleN newtype Mono a = Mono {single :: a} deriving Show {-# INLINE storeMono #-} storeMono :: Storable a => Store.Dictionary (Mono a) storeMono = Store.run $ fmap Mono $ Store.element single instance (Storable a) => Storable (Mono a) where {-# INLINE sizeOf #-} sizeOf = Store.sizeOf storeMono {-# INLINE alignment #-} alignment = Store.alignment storeMono {-# INLINE peek #-} peek = Store.peek storeMono {-# INLINE poke #-} poke = Store.poke storeMono data Stereo a = Stereo {left, right :: a} deriving Show -- inline makes performance even worse {- INLINE storeStereo -} storeStereo :: Storable a => Store.Dictionary (Stereo a) storeStereo = Store.run $ liftA2 Stereo (Store.element left) (Store.element right) instance (Storable a) => Storable (Stereo a) where {- INLINE sizeOf -} sizeOf = Store.sizeOf storeStereo {- INLINE alignment -} alignment = Store.alignment storeStereo {- INLINE peek -} peek = Store.peek storeStereo {- INLINE poke -} poke = Store.poke storeStereo size :: Int size = 10000000 main :: IO () main = mapM_ T.timeIt $ (print $ SV.last $ SV.iterateN size (1+) (0::Float)) : (print $ SV.last $ SV.iterateN size (1+) (0::Word8)) : (print $ SV.last $ SV.iterateN size (\x -> MonoN (singleN x + 1)) (MonoN (0::Float))) : (print $ SV.last $ SV.iterateN size (\x -> Mono (single x + 1)) (Mono (0::Float))) : (print $ SV.last $ SV.iterateN size (\x -> Stereo (left x + 1) (right x + 3)) (Stereo 1 2 :: Stereo Float)) : []