Tôi đang cố gắng tìm ra cách tối ưu hóa một số mã. Ở đây là:chức năng nội tuyến vẫn hiển thị trong tệp .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
Khi tôi biên dịch với GHC 6.12.1 (Ubuntu Linux trên một máy i486)
GHC --make -O2 Vec.hs -prof -Tự động -all -fforce-recomp
và chạy
Vec + RTS -p
Nhìn vào tập tin 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
tôi thấy rằng vx chức năng và vy mất một phần đáng kể trong thời điểm đó.
Tại sao lại như vậy? Tôi nghĩ rằng pragma CHUYÊN MÔN CHUYÊN MÔN sẽ làm cho những chức năng đó biến mất.
Khi sử dụng một tổ chức phi-đa hình
data Vec3D = Vec3D {vx, vy, vz :: !Double} deriving Show
chức năng vx, vy, vz không hiển thị như một trung tâm chi phí.
Bạn thực sự đã xem xét cốt lõi chưa? Cố gắng biên dịch với '-ddump-core' và xem, điều gì sẽ xảy ra. – fuz