Estoy tratando de averiguar cómo optimizar algunos códigos. Aquí está:funciones en línea todavía aparecen en el archivo .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
Cuando compilo con GHC 6.12.1 (Ubuntu Linux en una máquina i486)
GHC --make -O2 Vec.hs -prof -auto -todas -fforce-ReComp
y ejecutar
Vec + RTS -p
Mirando el archivo 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
veo que el VX función y vy toman una porción significativa del tiempo.
¿Por qué es eso? Pensé que SPECIALIZE INLINE pragma haría esas funciones desaparecen.
Cuando se utiliza un no polimórficos
data Vec3D = Vec3D {vx, vy, vz :: !Double} deriving Show
la funciones vx, vy, vz no muestran como un centro de costos.
¿De hecho miró el núcleo? Intenta compilar con '-ddump-core' y mira, qué sucedió. – fuz