J'essaie de comprendre comment optimiser du code. Ici, il est:fonctions inlined apparaissent toujours dans le fichier .prof
{-# OPTIONS_GHC -funbox-strict-fields #-}
data Vec3 a = Vec3 !a !a !a
vx :: Vec3 a -> a
vx (Vec3 x _ _) = x
{-# SPECIALIZE INLINE vx :: Vec3 Double -> Double #-}
vy :: Vec3 a -> a
vy (Vec3 _ y _) = y
{-# SPECIALIZE INLINE vy :: Vec3 Double -> Double #-}
vz :: Vec3 a -> a
vz (Vec3 _ _ z) = z
{-# SPECIALIZE INLINE vz :: Vec3 Double -> Double #-}
dot :: (Num a) => Vec3 a -> Vec3 a -> a
dot u v = (vx u * vx v) + (vy u * vy v) + (vz u * vz v)
{-# SPECIALIZE INLINE dot :: Vec3 Double -> Vec3 Double -> Double #-}
type Vec3D = Vec3 Double
-- just make a bunch of vecs to measure performance
n = 1000000 :: Double
v1s = [Vec3 x y z | (x, y, z) <- zip3 [1 .. n] [2 .. n + 1] [3 .. n + 2]]
:: [Vec3D]
v2s = [Vec3 x y z | (x, y, z) <- zip3 [3 .. n + 2] [2 .. n + 1] [1 .. n]]
:: [Vec3D]
dots = zipWith dot v1s v2s :: [Double]
theMax = maximum dots :: Double
main :: IO()
main = putStrLn $ "theMax: " ++ show theMax
Quand je compilez avec GHC 6.12.1 (linux ubuntu sur une machine i486)
GHC --make -O2 Vec.hs -Prof -auto -Toutes -fforce-ReComp
et exécuter
Vec + RTS -p
En regardant le fichier Vec.prof,
COST CENTRE MODULE %time %alloc
v2s Main 30.9 36.5
v1s Main 27.9 31.3
dots Main 27.2 27.0
CAF GHC.Float 4.4 5.2
vy Main 3.7 0.0
vx Main 2.9 0.0
theMax Main 2.2 0.0
Je vois que la fonction Vx et Vy prennent une part importante du temps.
Pourquoi est-ce? Je pensais que le pragma SPECIALIZE INLINE ferait ces fonctions disparaissent.
Lorsque vous utilisez un non polymorphes
data Vec3D = Vec3D {vx, vy, vz :: !Double} deriving Show
les fonctions vx, vy, vz ne montrent pas comme un centre de coûts.
Avez-vous réellement regardé core? Essayez de compiler avec '-ddump-core' et voyez, ce qui s'est passé. – fuz