simple-vec3-0.1.0.0: benchmark/Benchmark.hs
{-# LANGUAGE BangPatterns #-}
{-# 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 = 1000000
bigN :: Int
bigN = n * 10
foo :: Vec3 v => v -> v -> Double
foo v1 v2 = x1 + x2
where
(x1, _, _) = toXYZ v1
(x2, _, _) = toXYZ v2
{-# INLINE foo #-}
-- Access to whole elements
test :: (Show a, Vec3 a, VG.Vector v a) => v a -> v a -> IO ()
test v v2 = do
let !vr = VG.zipWith (<+>) v v
return ()
{-# INLINE test #-}
-- Access to x components of elements
testComp :: (Show a, Vec3 a, VG.Vector v a, VG.Vector v Double) => v a -> v a -> IO ()
testComp v v2 = do
let !vr = VG.zipWith (foo) v v
return ()
{-# INLINE testComp #-}
-- zipWith using generic dot product
testDotM :: (Show a, Vec3 a, VG.Vector v a, VG.Vector v Double) => v a -> v a -> IO ()
testDotM v v2 = do
let o = fromXYZ oXYZ
m = fromRows (o, o, o)
dotM' e1 e2 = dotM e1 e2 m
!vr = VG.zipWith dotM' v v2
return ()
{-# INLINE testDotM #-}
-- Note that source arrays are not forced in test functions.
tv :: VU.Vector TUVec3
tv = VG.replicate n $ fromXYZ oXYZ
uv :: VU.Vector UVec3
uv = VG.replicate n $ fromXYZ oXYZ
sv :: VS.Vector SVec3
sv = VG.replicate n $ fromXYZ oXYZ
tv' :: VU.Vector TUVec3
tv' = VG.replicate n $ fromXYZ oXYZ'
uv' :: VU.Vector UVec3
uv' = VG.replicate n $ fromXYZ oXYZ'
sv' :: VS.Vector SVec3
sv' = VG.replicate n $ fromXYZ oXYZ'
bsv :: VS.Vector SVec3
bsv = VG.replicate bigN $ fromXYZ oXYZ
buv :: VU.Vector UVec3
buv = VG.replicate bigN $ fromXYZ oXYZ
btv :: VU.Vector TUVec3
btv = VG.replicate bigN $ fromXYZ oXYZ
bsv' :: VS.Vector SVec3
bsv' = VG.replicate bigN $ fromXYZ oXYZ'
buv' :: VU.Vector UVec3
buv' = VG.replicate bigN $ fromXYZ oXYZ'
btv' :: VU.Vector TUVec3
btv' = VG.replicate bigN $ fromXYZ oXYZ'
main = defaultMain
[ bgroup "zipWith"
[ bench "Storable" $ test sv sv'
, bench "Unboxed (contiguous)" $ test uv uv'
, bench "Unboxed (tuples)" $ test tv tv'
]
, bgroup "zipWith-by-x"
[ bench "Storable" $ testComp sv sv'
, bench "Unboxed (contiguous)" $ testComp uv uv'
, bench "Unboxed (tuples)" $ testComp tv tv'
]
, bgroup "zipWith-dotM"
[ bench "Storable" $ testDotM sv sv'
, bench "Unboxed (contiguous)" $ testDotM uv uv'
, bench "Unboxed (tuples)" $ testDotM tv tv'
]
, bgroup "zipWith 10M"
[ bench "Storable" $ test bsv bsv'
, bench "Unboxed (contiguous)" $ test buv buv'
, bench "Unboxed (tuples)" $ test btv btv'
]
, bgroup "zipWith-by-x 10M"
[ bench "Storable" $ testComp bsv bsv'
, bench "Unboxed (contiguous)" $ testComp buv buv'
, bench "Unboxed (tuples)" $ testComp btv btv'
]
, bgroup "zipWith-dotM 10M"
[ bench "Storable" $ testDotM bsv bsv'
, bench "Unboxed (contiguous)" $ testDotM buv buv'
, bench "Unboxed (tuples)" $ testDotM btv btv'
]
]