{-# OPTIONS_GHC -funbox-strict-fields -ddump-simpl -ddump-simpl-stats -O #-}
{- -dverbose-core2core -ddump-simpl-iterations -}
{-
This module allows to compare speed of custom Storable instance of Stereo
versus the ones implemented using Storable.Record and Storable.Traversable.
-}
module Main where
-- import qualified Sound.Frame.Stereo as Stereo
import qualified Sound.Frame.Stereo.Traversable as Stereo
-- import qualified Sound.Frame.Stereo.Record as Stereo
import qualified Data.StorableVector as SV
import Control.Applicative (pure, liftA2, )
import Foreign.Storable.Tuple ()
import Data.Int (Int16)
import GHC.Float (float2Int, )
{-
GHC-6.10.4:
Custom Storable instance:
real 0m0.680s
user 0m0.560s
sys 0m0.112s
Storable.Traversable instance:
real 0m25.187s
user 0m25.014s
sys 0m0.152s
Storable.Record instance:
real 0m3.017s
user 0m2.844s
sys 0m0.168s
-}
stereo :: SV.Vector (Stereo.T Int16)
stereo =
fst $ SV.unfoldrN 10000000
(\x0 ->
let frac x = x - fromIntegral (float2Int x)
x1 = frac (x0+440/44100)
y0 = 2*x0-1
toInt16 y =
fromIntegral $
float2Int (y*fromIntegral(maxBound::Int16))
in Just (Stereo.cons (toInt16 y0) (toInt16 y0), x1))
(0::Float)
{-
GHC-6.10.4:
Custom Storable instance:
real 0m0.698s
user 0m0.668s
sys 0m0.032s
Storable.Traversable instance:
real 0m47.012s
user 0m46.839s
sys 0m0.164s
Storable.Record instance:
real 0m4.382s
user 0m4.336s
sys 0m0.044s
GHC-6.12.1:
Storable.Traversable instance:
real 0m47.021s
user 0m46.827s
sys 0m0.108s
-}
stereoSum :: SV.Vector (Stereo.T Int16) -> Stereo.T Int16
stereoSum =
SV.foldl' (liftA2 (+)) (pure 0)
stereoPair :: SV.Vector (Int16,Int16)
stereoPair =
fst $ SV.unfoldrN 10000000
(\x0 ->
let frac x = x - fromIntegral (float2Int x)
x1 = frac (x0+440/44100)
y0 = 2*x0-1
toInt16 y =
fromIntegral $
float2Int (y*fromIntegral(maxBound::Int16))
in Just ((toInt16 y0, toInt16 y0), x1))
(0::Float)
main :: IO ()
main =
print $ stereoSum stereo
-- SV.writeFile "speed.s16" stereo