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
]