Sto cercando di capire come ottimizzare un po 'di codice. Eccolo:le funzioni inline appaiono ancora nel file .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
Quando compilo con GHC 6.12.1 (Ubuntu Linux su una macchina i486)
ghc --make -O2 Vec.hs -Prof -auto -all -fforce-ReComp
ed eseguire
Vec + RTS -p
Guardando il file 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
vedo che la funzione VX e VY prendono una parte significativa del tempo.
Perché è quello? Ho pensato che il pragma SPECIALIZE INLINE avrebbe reso quelle funzioni vanno via.
Quando si utilizza un non-polimorfica
data Vec3D = Vec3D {vx, vy, vz :: !Double} deriving Show
le funzioni vx, vy, vz non mostrano come centro di costo.
Hai davvero guardato al centro? Prova a compilare con '-ddump-core' e vedi cosa è successo. – fuz