packages feed

sample-frame-0.0.2: src/SpeedTest.hs

{-# 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