일부 코드를 최적화하는 방법을 찾으려고합니다. 여기있다 :인라인 된 함수는 여전히 .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
내가 GHC 6.12.1 (우분투을 i486 시스템에서 리눅스)로 컴파일 할 때
GHC --make -O2 Vec.hs -prof -auto - 모든 -fforce-recomp
실행
VEC + RTS -p
Vec.prof 파일을 보면,
내가 함수 VX와 VY의 시간의 상당 부분을 볼
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
.
왜 그럴까요? SPECIALIZE INLINE 플러그인이 함수를 사라지게 만들 것이라고 생각했습니다. 비 다형성
data Vec3D = Vec3D {vx, vy, vz :: !Double} deriving Show
기능의 VX, VY를 사용하는 경우
은 VZ는 비용 센터로 표시되지 않습니다.
실제로 코어를 보았습니까? '-ddump-core'로 컴파일하고 무슨 일이 일어나는지보십시오. – fuz