में दिखाई देते हैं, मैं कुछ कोड को अनुकूलित करने का तरीका जानने का प्रयास कर रहा हूं। संदेश यह है:इनलाइन फ़ंक्शंस अभी भी .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 (ubuntu एक i486 मशीन पर लिनक्स) के साथ संकलन
GHC --make -O2 Vec.hs -prof ऑटो निर्माण सभी -fforce-recomp
और चलाने
वीइसी + आरटीएस -p
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
मुझे लगता है कि समारोह VX और vy समय का एक महत्वपूर्ण भाग लेते हैं।
वह क्यों है? मैंने सोचा कि विशेष इनलाइन प्राग्मा करेगा जो कि कार्य दूर हो जाएंगे।
एक गैर बहुरूपी
data Vec3D = Vec3D {vx, vy, vz :: !Double} deriving Show
कार्यों वीएक्स, vy उपयोग करते समय, vz एक लागत केंद्र के रूप में नहीं दिखाते।
क्या आपने वास्तव में कोर को देखा था? '-ddump-core 'के साथ संकलित करने का प्रयास करें और देखें, क्या खुशी है। – fuz