2011-01-13 24 views
5

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.

+1

Aslında çekirdeğe baktınız mı? -ddump-core ile derlemeye çalışın ve ne olduğunu görün. – fuz

cevap

2

Bu durumun, GHC'nin normalde inlining dahil olmak üzere gerçekleştireceği birçok optimizasyonu engelleyen -auto-all'un bir yan etkisi olduğundan şüpheleniyorum. Polimorfik olmayan sürümünüzdeki farkın aslında vx, vy ve vz'un polimorfizmden ziyade kayıt sözdizimi yoluyla tanımlandığından şüpheleniyorum (ama bu konuda yanlış olabilirim).

-auto-all yerine, modüle bir dışa aktarma listesi eklemeyi ve "-otomatik" ile derlemeyi veya SCC pragmas üzerinden maliyet merkezlerini el ile ayarlamayı deneyin. Genelde SCC pragmalarını kullanırım, çünkü genellikle onları izin verilen işlevlere ayarlamak isterim;

2

Yanıtlara nasıl yorum yapılacağını anlayamadım, bu nedenle bu yanıtta yorum yapıyorum.

İlk olarak, cevaplarınız için teşekkürler.

FUZxxl: -Kolay çekirdeği denedim ve bir hata iletisi aldım -ddump-core tanınmayan bir bayraktı. Belki de demek istedin, gerçek Dünya Haskell'in önerdiği kitap, ama sonuç olarak nasıl okunacağını bilmiyorum. "Vx" için çıktı dosyasına baktım, ama onları hiç görmedim. Sanırım çekirdek okumayı öğrenmeliyim. Bunun için iyi bir rehber var mı?

John: Ben doğru okuyorum eğer ghc en flag reference documentation göre, -auto ve-auto-hepsi hem fonksiyonları değil belirgin SIRALI için _scc_s eklemek gerekiyor. -otonun benim için çalışıp çalışmadığını görmek için, Vec3 kodunun ayrı bir dosya/modülde olduğu, Vec3 (Vec3), vx, vy, vz ve nokta dışa aktarıldığı bir başka test durumu yarattım. Bu modülü bir Main.hs dosyasına aktardım. Bunları -otomatik olarak derledim, hala .prof dosyasında vx, vy, vz gördüm.

Re: Fark yerine polimorfizm rekor sözdizimi nedeniyle olabileceğini yorumunuz, ben hala

data Vec3 a = Vec3 {vx, vy, vz :: !a} 

vx, vy ve VZ tanımlandığında çünkü fark nedeniyle polimorfizm daha yatkın olduğuna inanıyoruz .prof dosyasında ortaya çıktı.

Tad

+0

Sorularınız için gerçek bir hesap kullanmayı düşünmelisiniz. Eğer böyle bir hesabınız varsa, commoents'ı önce kendi sorularınıza ve daha sonra itibarımız yeterince yüksek olduğunda herhangi bir şeye bırakabilirsiniz. – fuz

+0

Tavsiye ettiğiniz için teşekkür ederiz. Bunu şimdi yaptım. – Tad