2015-05-13 17 views
12

-prof ile derleyerek Haskell programımda optimizasyon fırsatları arıyorum, ancak elips içeren maliyet merkezlerini nasıl yorumlayacağımı bilmiyorum. filter.(...) ve jankRoulette.select.(...) nedir? yukarı olarak filter.foo, filter.bar vb. (...) .prof raporunda ne anlama geliyor?

filter a b = blahblah where 
    foo = bar 
    bar = baz 
    baz = bing 

Ama bu tüm gösterir: $ ghc --make -rtsopts -prof -auto-all main.hs && ./main +RTS -p && cat main.prof

fonksiyon filter bir where yan tümcesinde birkaç tanımlar, böyle sahiptir:

COST CENTRE    MODULE      %time %alloc 

filter.(...)    Forest      46.5 22.3 
set-union     Forest      22.5 4.1 
cache-lookup    Forest      16.0 0.1 
removeMany     MultiMapSet     3.7 1.9 
insertMany     MultiMapSet     3.3 1.8 
jankRoulette.select.(...) Forest      1.4 15.2 

Birlikte oluşturulur

İç içe geçirilmiş ifadeler olabileceğini düşündüm ancak jankRoulette.select'in hiçbiri yok. Ve SCC direktiflerini çoğunun önüne ekledim.

Çoğu zaman filter.(...) numaralı belgede geçirildiği için bunun ne olduğunu bilmek isterim. 5,

+1

"TODO" yorumunda, kodun önerdiği alıntılar önerilmelidir, GHC profiler raporları (ve derleyici çıktılarının hemen hemen her şeyi) her zaman "ghc --version" sonucunun eşlik etmesi gerekir. – dfeuer

+0

Hatırlatıcı için teşekkürler! Posterity için, The Glorious Glasgow Haskell Derleme Sistemi, 7.8.1 versiyonunu çalıştırıyorum. – alltom

cevap

7

TL; DR: GHC, let (x,y) = c gibi izin verilen bir desen eşlemesinde bir desen eşleşmesi yaptığınızda bunu üretir. c değerlendirmesinin maliyeti ... maliyet merkezi tarafından takip edilir (çünkü buna özel bir isim yoktur).


Peki bunu nasıl öğrendim? GHC kaynak kodunda (...) için bir grep aşağıdaki bulur (derleyici/deSugar/Coverage.hs itibaren):

-- TODO: Revisit this 
addTickLHsBind (L pos ([email protected](PatBind { pat_lhs = lhs, pat_rhs = rhs }))) = do 
    let name = "(...)" 
    (fvs, rhs') <- getFreeVars $ addPathEntry name $ addTickGRHSs False False rhs 

    {- ... more code following, but not relevant to this purpose 
    -} 

o kod desen bağlamaları ile bir şey yapmak zorunda olduğunu söyler. yüzden küçük bir test programı davranışını kontrol etmek yapabilirsiniz:

x :: Int 
(x:_) = reverse [1..1000000000] 

main :: IO() 
main = print x 

Sonra, etkin profilleme ile bu programı çalıştırabilirsiniz.

COST CENTRE MODULE     no.  entries %time %alloc %time 

%alloc 
MAIN  MAIN      42   0 0.0 0.0 100.0 100.0 
CAF  Main      83   0 0.0 0.0 100.0 100.0 
    (...)  Main      86   1 100.0 100.0 100.0 100.0 
    x   Main      85   1 0.0 0.0  0.0 0.0 
    main  Main      84   1 0.0 0.0  0.0 0.0 

Yani kodundan yapılan varsayım doğru çıkıyor: Bir gerçekten, GHC aşağıdaki çıktıyı üretir. Programın her zaman reverse [1..1000000000] ifadesini değerlendirmek için harcanır ve (...) maliyet merkezine atanır.

+0

Burada “TODO” yorumunu seviyorum (ve tamamen sempati duyuyorum): P. –

+0

Corollary: maliyet merkezlerini netleştirmek için, desen eşleştirmeden önce değerleri adlandırın; gibi (foo = reverse [1..10000000] ')' (x: _) = foo gibi. Harika cevaplar, bennofs, teşekkürler bir ton! – alltom