packages feed

simple-vec3-0.3: benchmark/Benchmark.hs

{-# LANGUAGE FlexibleContexts #-}

import Criterion.Main

import Data.Vector.Generic as VG
import Data.Vector.Storable as VS
import Data.Vector.Unboxed as VU

import Data.Vec3


oXYZ :: (Double, Double, Double)
oXYZ = (19.899999999, 22.8, -100500)


oXYZ' :: (Double, Double, Double)
oXYZ' = (2, 12, 85.06)


n :: Int
n = 10000000


-- Access to whole elements
testWhole :: (Vec3 a, VG.Vector v a) => v a -> v a -> Benchmarkable
testWhole v v2 = whnf (uncurry $ VG.zipWith (<+>)) (v, v2)


-- Access to x components of elements
testComp :: (Vec3 a, VG.Vector v a, VG.Vector v Double) => v a -> v a -> Benchmarkable
testComp v v' = whnf (uncurry $ VG.zipWith foo) (v, v')
  where
    foo v1 v2 = x1 + x2
      where
        (x1, _, _) = toXYZ v1
        (x2, _, _) = toXYZ v2


-- zipWith using generic dot product
testDotM :: (Vec3 a, VG.Vector v a, VG.Vector v Double) => v a -> v a -> Benchmarkable
testDotM v v2 = whnf (uncurry $ VG.zipWith dotM') (v, v2)
  where
    o = fromXYZ oXYZ
    m = fromRows (o, o, o)
    dotM' e1 e2 = dotM e1 e2 m


testNormalize :: (Vec3 a, VG.Vector v a) => v a -> Benchmarkable
testNormalize = whnf (VG.map normalize)


-- Note that source arrays are not forced in test functions.

csv :: VS.Vector CVec3
csv = VG.replicate n $ fromXYZ oXYZ


cuv :: VU.Vector CVec3
cuv = VG.replicate n $ fromXYZ oXYZ


tv :: VU.Vector TVec3
tv = VG.replicate n $ fromXYZ oXYZ


csv' :: VS.Vector CVec3
csv' = VG.replicate n $ fromXYZ oXYZ'


cuv' :: VU.Vector CVec3
cuv' = VG.replicate n $ fromXYZ oXYZ'


tv' :: VU.Vector TVec3
tv' = VG.replicate n $ fromXYZ oXYZ'


main :: IO ()
main = defaultMain
       [ bgroup "CVec3/Storable" $ mkGroup csv csv'
       , bgroup "CVec3/Unboxed"  $ mkGroup cuv cuv'
       , bgroup "TVec3/Unboxed"  $ mkGroup tv tv'
       ]
  where
    mkGroup v1 v2 =
      [ bench "zipWith-add"      $ testWhole v1 v2
      , bench "zipWith-by-x-add" $ testComp v1 v2
      , bench "zipWith-dotM"     $ testDotM v1 v2
      , bench "normalize"        $ testNormalize v1
      ]