Bazı kodların nasıl en iyileştirileceğini anlamaya çalışıyorum. İşte burada:Satır içi işlevler hala .prof dosyasında görünür.
{-# 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
ben ghc 6.12.1 (ubuntu bir i486 makinede linux) ile derlerken
ghc açığa kavuşturabilir O2 Vec.hs -Prof -auto -tüm -fforce-ReComp
ve çalışma
Vec + RTS -p
Vec.prof dosyası baktığımızda,
Ben fonksiyon vx ve vy zamanın önemli bir bölümünü almak görüyoruz
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
.
Neden? ÖZELLEŞTİRİLMİŞ INLINE pragma'nın bu işlevlerin olmasını sağlayacağını düşündüm. olmayan bir polimorfik
data Vec3D = Vec3D {vx, vy, vz :: !Double} deriving Show
fonksiyonları vx, vy kullanırken
, vz bir maliyet merkezi olarak gösterme.
Aslında çekirdeğe baktınız mı? -ddump-core ile derlemeye çalışın ve ne olduğunu görün. – fuz